2016-02-15 17 views
13

Czy istnieje sposób sprawdzenia, czy iterator przekazał jako argument do fnc to reverse_itator? Czy mogę użyć funkcji funkcji iteratora?Sprawdź, czy typem iteratora jest reverse_iterator

+0

Istnieją indeeds [ 'std :: iterator_traits'] (http://en.cppreference.com/w/cpp/iterator/iterator_traits), które mogą być możliwe do użycia. –

+6

Z ciekawości, dlaczego miałbyś to zrobić? Trudno wymyślić dobry przypadek użycia. –

Odpowiedz

10

To trywialne napisać o częściowej specjalizacji:

#include <iterator> 
#include <type_traits> 

template<typename Iter> 
    struct is_reverse_iterator 
    : std::false_type { }; 

template<typename Iter> 
    struct is_reverse_iterator<std::reverse_iterator<Iter>> 
    : std::true_type { }; 

Chociaż jak wskazano poniżej, to nie obsługiwać (IMHO mało prawdopodobne) przypadku „reverse-reverse” iterator. Ta nieco mniej trywialna wersja w odpowiedzi Bathsheby poprawnie obsługuje ten przypadek.

+1

Nie obsłuży to 'std :: reverse_iterator >' well. Druga odpowiedź będzie. – LogicStuff

+5

Prawdopodobnie te dwie odpowiedzi robią użytecznie różne rzeczy w tym trudnym przypadku. Zależnie od tego, dlaczego chcesz się dowiedzieć, czy jest to "reverse_iterator", możesz potraktować iterator z podwójną ścieżką jako jeden (ponieważ jest to typ będący instancją 'reverse_iterator') lub jako nie będący jednym (ponieważ iteruje "naprzód", cokolwiek to znaczy w kontekście). –

7

Niektóre kod używam w produkcji:

#include <iterator> 
#include <type_traits> 
template<typename I> 
struct is_reverse_iterator : std::false_type 
{ 
}; 

template<typename I> 
struct is_reverse_iterator<std::reverse_iterator<I>> 
: std::integral_constant<bool, !is_reverse_iterator<I>::value> 
{ 
}; 
+0

+1. Dzięki. Kilka nowych rzeczy ze std library dla nowicjuszy takich jak ja. Nigdy nie wiedziałem o 'std :: integral_constant',' std :: false_type' – ubuntugod

+1

"Jakiś kod, którego używam w produkcji" - jaki jest twój przypadek użycia? Podobnie jak Marc Glisse, nie rozumiem, dlaczego chciałbyś to zrobić. – user2357112