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
risposta
È 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.
Questo non gestirà 'std :: reverse_iterator
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). –
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>
{
};
+1. Grazie. Un paio di novità dalla libreria std per un principiante come me. Mai saputo di 'std :: integral_constant',' std :: false_type' – ubuntugod
"Alcuni codici che uso in produzione" - qual è il tuo caso d'uso? Come Marc Glisse, non vedo perché vorresti farlo. – user2357112
ci sono indeeds [ 'std :: iterator_traits'] (http://en.cppreference.com/w/cpp/iterator/iterator_traits) che potrebbe essere possibile da usare –
Per curiosità, perché vorresti farlo? Ho difficoltà a trovare un buon caso d'uso. –