C++ に、いくつかの有用な作業を行うだけでなく、出力反復子を介して一連の値を出力するテンプレート関数があるとします。ここで、値のシーケンスが興味深い場合もあれば、役に立たない場合もあるとします。インスタンス化して関数に渡すことができ、関数が出力反復子に割り当てようとする値を無視する、すぐに使用できる反復子クラスが STL にあるか? 別の言い方をすれば、すべてのデータを /dev/null に送信しますか?
4 に答える
STL はそのような反復子を提供しません。ただし、自分でコーディングすることもできます (そのコードをテストしました):
struct null_output_iterator :
std::iterator< std::output_iterator_tag,
null_output_iterator > {
/* no-op assignment */
template<typename T>
void operator=(T const&) { }
null_output_iterator & operator++() {
return *this;
}
null_output_iterator operator++(int) {
return *this;
}
null_output_iterator & operator*() { return *this; }
};
の結果としてそれ自体を使用することにより、データは必要ありませんoperator*
。の結果は*it = x;
出力反復子の要件では使用されないため、戻り値の型を に指定できますvoid
。
編集:これがどのように機能するかを見てみましょうoperator*
。標準は、24.1.2/1 で、出力反復子の要件について、これらの両方のケースで次のように述べています。
*it = t;
*it++ = t;
それらの式の結果が使用されないこと。それがこの作品を作るものです:
null_output_iterator it;
*it; // returns a null_output_iterator& per definition of the `operator*`.
*it = some_value; // returns void per definition of the templated `operator=`.
これで、返すデータは必要ありませんoperator*
。イテレータ自体を使用するだけです。テンプレート化された operator= は、組み込みのコピー代入演算子を上書きしないことに注意してください。今でも提供されています。
ブーストはありますか?その場合は、空の関数をラップするfunction_output_iteratorを使用できます。
しかし、それは理想的ではありません。どのイテレーターを使用しても、それが破棄されたとしても、operator* で return のために value_type のインスタンスを作成する必要があります。
1つ書くのは難しくありません。
template<typename T>
class NullOutputIterator
{
public:
NullOutputIterator() {}
NullOutputIterator& operator++() { return *this; }
NullOutputIterator& operator++(int) { return *this; }
T& operator*() { return m; }
T* operator->() { return &m; }
private:
T m;
};
私はこれをテストしておらず、おそらく重要な何かが欠けているかもしれませんが、これがアイデアだと思います。