2016-12-01 22 views
3
template<typename Iterator> 
void put_value(Iterator pos, int n) 
{ 
    static_assert(IsOutputIterator<Iterator>); 
    // 
    // How to implement IsOutputIterator? 
    // 

    *pos = n; 
} 

std::iterator_traits<Iterator>::iterator_categoryは役に立ちません。たとえば、vector<int>::iteratoroutput_iteratorが明らかですが、std::iterator_traits<vector<int>::iterator>::iterator_categoryrandom_access_iteratorを返します。output_iterator、たとえばconst_iteratorではない可能性があります。イテレータがC++のoutput_iteratorであるかどうかをチェックする方法は?

イテレータがC++のoutput_iteratorであるかどうかを確認する方法はありますか?

+0

入力イテレータカテゴリ以外のイテレータは出力イテレータです。 – Eugene

+0

ランダムアクセスイテレータは出力イテレータのすべての要件を満たします。 –

+0

いいえ、出力イテレータが読み込みを許可していない可能性があります。あなたはそれに書き込むことができます。 –

答えて

3

私の最初の応答は、「出力イテレータは何を求めていますか?」です。同じイテレータが複数の値型を出力できるため、C++の出力イテレータは値型を指定しません。指定された式Eを指定されたイテレータoで書くことができるかどうかを判断する唯一の方法は、*o = std::declval<decltype((E))>()が有効な式であるかどうかを確認することです。

C++ 14では

I'd define a trait to do so

概念にC++で
template <class...> using void_t = void; 

template <class, class, class = void> 
constexpr bool is_output_iterator = false; 

template <class I, class E> 
constexpr bool is_output_iterator<I, E, void_t< 
    typename std::iterator_traits<I>::iterator_category, 
    decltype(*std::declval<I>() = std::declval<E>())>> = true; 

- 私はあなたがでこの質問をタグ付けされたので、に興味があると仮定し - 私はsample Ranges TS implementation from githubを取得し、代わりにそのOutputIterator<I, E>()概念を使用します。

関連する問題