fncにargとして渡されたイテレータがreverse_iteratorであるかどうかをチェックする方法はありますか?私が使うことができるイテレータの特性はありますか?イテレータのタイプがreverse_iteratorかどうかをチェック
答えて
それは部分的な特殊化を書くために些細です:
#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 { };
以下の指摘するように、これは「逆逆の」イテレータの(私見そう)のケースを処理しませんが。バテシバの答えのやや些細でないバージョンは、そのケースを正しく処理します。
これは 'std :: reverse_iterator
おそらく2つの答えは、そのトリッキーなケースでは便利なことになるでしょう。なぜそれが 'reverse_iterator'かどうかを知りたがっているかどうかに応じて、ダブルリバースイテレータを(reverse_iteratorのインスタンス化であるタイプなので)1つとして扱うか、 (それは文脈で意味するものであれば、「フォワード」を繰り返すからです)。 –
私は生産に使用する一部のコード:
#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。ありがとう。私のような初心者のためのstdライブラリからの新しいもののカップル。 'std :: integral_constant'、' std :: false_type'を全く知りませんでした – ubuntugod
"私がプロダクションで使用するいくつかのコード" - あなたのユースケースは何ですか? Marc Glisseのように、私はあなたがこれをしたい理由を見ていない。 – user2357112
はindeedsあります[ 'のstd :: iterator_traits'](http://en.cppreference.com/w/cpp/iterator/iterator_traits)であるかもしれません使用することができます。 –
好奇心で、なぜあなたはそれをしたいですか?私は良いユースケースを考え出すのは難しいです。 –