2016-02-15 9 views
13

fncにargとして渡されたイテレータがreverse_iteratorであるかどうかをチェックする方法はありますか?私が使うことができるイテレータの特性はありますか?イテレータのタイプがreverse_iteratorかどうかをチェック

+0

はindeedsあります[ 'のstd :: iterator_traits'](http://en.cppreference.com/w/cpp/iterator/iterator_traits)であるかもしれません使用することができます。 –

+6

好奇心で、なぜあなたはそれをしたいですか?私は良いユースケースを考え出すのは難しいです。 –

答えて

10

それは部分的な特殊化を書くために些細です:

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

以下の指摘するように、これは「逆逆の」イテレータの(私見そう)のケースを処理しませんが。バテシバの答えのやや些細でないバージョンは、そのケースを正しく処理します。

+1

これは 'std :: reverse_iterator >'をうまく扱いません。もう一つの答えは。 – LogicStuff

+5

おそらく2つの答えは、そのトリッキーなケースでは便利なことになるでしょう。なぜそれが 'reverse_iterator'かどうかを知りたがっているかどうかに応じて、ダブルリバースイテレータを(reverse_iteratorのインスタンス化であるタイプなので)1つとして扱うか、 (それは文脈で意味するものであれば、「フォワード」を繰り返すからです)。 –

7

私は生産に使用する一部のコード:

#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。ありがとう。私のような初心者のためのstdライブラリからの新しいもののカップル。 'std :: integral_constant'、' std :: false_type'を全く知りませんでした – ubuntugod

+1

"私がプロダクションで使用するいくつかのコード" - あなたのユースケースは何ですか? Marc Glisseのように、私はあなたがこれをしたい理由を見ていない。 – user2357112