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
Odpowiedz
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.
Nie obsłuży to 'std :: reverse_iterator
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). –
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>
{
};
+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
"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
Istnieją indeeds [ 'std :: iterator_traits'] (http://en.cppreference.com/w/cpp/iterator/iterator_traits), które mogą być możliwe do użycia. –
Z ciekawości, dlaczego miałbyś to zrobić? Trudno wymyślić dobry przypadek użycia. –