2016-02-15 14 views
13

C'è un modo per verificare se l'iteratore è passato come argomento a fnc è reverse_iterator? Ci sono funzioni tratti iteratori che potrei usare?Controlla se il tipo di iteratore è reverse_iterator

+0

ci sono indeeds [ 'std :: iterator_traits'] (http://en.cppreference.com/w/cpp/iterator/iterator_traits) che potrebbe essere possibile da usare –

+6

Per curiosità, perché vorresti farlo? Ho difficoltà a trovare un buon caso d'uso. –

risposta

10

È banale scrivere con una specializzazione parziale:

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

Sebbene come precisato qui di seguito, questo non gestisce il caso (IMHO improbabile) di un iteratore "reverse-reverse". La versione un po 'meno banale nella risposta di Bathsheba gestisce correttamente la causa.

+1

Questo non gestirà 'std :: reverse_iterator >' bene. L'altra risposta lo farà. – LogicStuff

+5

Forse le due risposte fanno cose utilmente diverse con quel caso complicato. A seconda del motivo per cui vuoi sapere se si tratta di un 'reverse_iterator', potresti voler trattare un iteratore double-reverse come se fosse uno (perché è effettivamente di un tipo che è un'istanza di' reverse_iterator') o come non essere uno (perché itera "avanti", qualunque cosa significhi nel contesto). –

7

Alcuni codice che utilizzo nella produzione:

#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. Grazie. Un paio di novità dalla libreria std per un principiante come me. Mai saputo di 'std :: integral_constant',' std :: false_type' – ubuntugod

+1

"Alcuni codici che uso in produzione" - qual è il tuo caso d'uso? Come Marc Glisse, non vedo perché vorresti farlo. – user2357112