proxyを使うoutput iteratorって別にproxyのクラスを用意しなくても,自分自身がproxyの働きをすれば良いのですね.今までなんで気付かなかったんだろう・・・.(「Generic Programming」(asin:4756134416)にチラッと書いてあるのを読んで気が付いた)
以下はこの考えに基づいた標準ライブラリのback_insert_iteratorの実装例.
template// BIS = BackInsertionSequence class back_insert_iterator : public boost::iterator_facade< back_insert_iterator , back_insert_iterator , boost::incrementable_traversal_tag, back_insert_iterator > { friend class boost::iterator_core_access; public: back_insert_iterator(BIS &s) : s(s) { } back_insert_iterator(back_insert_iterator const &r) : s(r.s) { } // proxyとして機能するための代入演算子 // 返り値がvoidなのはただの好み // (*i = *i++ = tなどの式を排除する意図) void operator=(typename BIS::value_type const &x) { s.push_back(x); } private: void increment() { } back_insert_iterator dereference() const { // 自分自身がproxyの役割を果たすのでdereferenceでは自分自身を返す return *this; } BIS &s; };