proxyを使うoutput iterator

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