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
Antwort
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.
Das wird 'std :: reverse_iterator
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). –
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>
{
};
+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
"Etwas Code, den ich in der Produktion verwende" - was ist dein Anwendungsfall? Wie Marc Glisse sehe ich nicht, warum du das machen willst. – user2357112
Es indeeds sind [ 'std :: iterator_traits'] (http://en.cppreference.com/w/cpp/iterator/iterator_traits), das sein könnte möglich zu verwenden. –
Aus Neugier, warum willst du das machen? Es fällt mir schwer, einen guten Anwendungsfall zu finden. –