22

C++ に、いくつかの有用な作業を行うだけでなく、出力反復子を介して一連の値を出力するテンプレート関数があるとします。ここで、値のシーケンスが興味深い場合もあれば、役に立たない場合もあるとします。インスタンス化して関数に渡すことができ、関数が出力反復子に割り当てようとする値を無視する、すぐに使用できる反復子クラスが STL にあるか? 別の言い方をすれば、すべてのデータを /dev/null に送信しますか?

4

4 に答える 4

24

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= は、組み込みのコピー代入演算子を上書きしないことに注意してください。今でも提供されています。

于 2008-12-03T01:15:41.430 に答える
4

ブーストはありますか?その場合は、空の関数をラップするfunction_output_iteratorを使用できます。

しかし、それは理想的ではありません。どのイテレーターを使用しても、それが破棄されたとしても、operator* で return のために value_type のインスタンスを作成する必要があります。

于 2008-12-03T00:53:05.157 に答える
4

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

私はこれをテストしておらず、おそらく重要な何かが欠けているかもしれませんが、これがアイデアだと思います。

于 2008-12-03T00:56:31.577 に答える