2016-02-15 11 views
13

Yineleyicinin argüman olarak fnc'ye geçip geçmediğini kontrol etmenin bir yolu var mı reverse_iterator? Kullanabileceğim herhangi bir yineleyici özellik fonksiyonu var mı?Yineleyicinin türü reverse_iterator olup olmadığını kontrol edin

+0

indeeds vardır [ 'std :: iterator_traits'] (http://en.cppreference.com/w/cpp/iterator/iterator_traits) olabilir kullanmak mümkün. –

+6

Merak etme, neden bunu yapmak istersiniz? İyi bir kullanım vakasıyla gelmekte zorlanıyorum. –

cevap

10

Bu kısmi uzmanlaşma ile yazmaya Önemsiz: aşağıda işaret rağmen

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

, bu bir "ters-ters" yineleyici (IMHO olası) davayı işlemez. Bathsheba'nın cevabındaki biraz daha az önemsiz versiyon bu durumu doğru olarak ele alıyor.

+1

Bu, "std :: reverse_iterator >" kuyusunu işlemez. Diğer cevaplar. – LogicStuff

+5

Muhtemelen iki cevap, bu zor davayla farklı şeyler yapar. Neden bir "reverse_iterator" olup olmadığını bilmek istediğinize bağlı olarak, bir çift ters yineleyiciye bir tane olarak davranmak isteyebilirsiniz (çünkü bu aslında 'reverse_iterator' ın bir örneği olan bir türdendir) veya tek bir (çünkü "ileriye doğru", çünkü bağlamda ne anlama gelirse). –

7

I üretiminde kullanımı bazı kod:

#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. Teşekkürler. Benim gibi bir yeni başlayan için std kütüphanesinden birkaç yeni şey. Std :: integral_constant', std :: false_type' – ubuntugod

+1

"Üretimde kullandığım bazı kodlar" - asla kullanım durumunuz nedir? Marc Glisse gibi, neden bunu yapmak istediğini göremiyorum. – user2357112