2016-02-15 10 views
13

Gibt es eine Möglichkeit, zu überprüfen, ob der Iterator als arg an Fnc übergeben wurde, ist reverse_iterator? Gibt es Iterator Traits-Funktionen, die ich verwenden könnte?Überprüfen, ob der Typ des Iterators reverse_iterator ist

+0

Es indeeds sind [ 'std :: iterator_traits'] (http://en.cppreference.com/w/cpp/iterator/iterator_traits), das sein könnte möglich zu verwenden. –

+6

Aus Neugier, warum willst du das machen? Es fällt mir schwer, einen guten Anwendungsfall zu finden. –

Antwort

10

Es ist trivial mit einer partiellen Spezialisierung zu schreiben:

#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 { }; 

Obwohl, wie unten erwähnt, nicht den (IMHO unwahrscheinlich) Fall eines „Reverse-Reverse“ Iterator nicht handhaben. Die etwas weniger triviale Version in Bathshebas Antwort behandelt diesen Fall korrekt.

+1

Das wird 'std :: reverse_iterator > gut nicht behandeln. Die andere Antwort wird. – LogicStuff

+5

Möglicherweise sind die zwei Antworten nützlich verschiedene Dinge mit diesem schwierigen Fall. Je nachdem, warum Sie wissen möchten, ob es sich um einen Reverse_iterator handelt oder nicht, sollten Sie einen Double-Reverse-Iterator als einen solchen behandeln (weil er tatsächlich eine Instanz von reverse_iterator ist) oder nicht (weil es "vorwärts" iteriert, was auch immer das im Zusammenhang bedeutet). –

7

Einige Code, den ich in der Produktion verwenden:

#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. Vielen Dank. Ein paar neue Sachen von der Std-Bibliothek für einen Neuling wie mich. Nie gewusst von 'std :: integral_constant',' std :: false_type' – ubuntugod

+1

"Etwas Code, den ich in der Produktion verwende" - was ist dein Anwendungsfall? Wie Marc Glisse sehe ich nicht, warum du das machen willst. – user2357112