
[section:function_output Function Output Iterator]

The function output iterator adaptor makes it easier to create custom
output iterators. The adaptor takes a unary function and creates a
model of Output Iterator. Each item assigned to the output iterator is
passed as an argument to the unary function.  The motivation for this
iterator is that creating a conforming output iterator is non-trivial,
particularly because the proper implementation usually requires a
proxy object.

[h2 Example]

    struct string_appender
    {
        string_appender(std::string& s)
            : m_str(&s)
        {}

        void operator()(const std::string& x) const
        {
            *m_str += x;
        }

        std::string* m_str;
    };

    int main(int, char*[])
    {
      std::vector<std::string> x;
      x.push_back("hello");
      x.push_back(" ");
      x.push_back("world");
      x.push_back("!");

      std::string s = "";
      std::copy(x.begin(), x.end(), 
		boost::make_function_output_iterator(string_appender(s)));

      std::cout << s << std::endl;

      return 0;
    }

[h2 Reference]

[h3 Synopsis]

  template <class UnaryFunction>
  class function_output_iterator {
  public:
    typedef std::output_iterator_tag iterator_category;
    typedef void                     value_type;
    typedef void                     difference_type;
    typedef void                     pointer;
    typedef void                     reference;

    explicit function_output_iterator();

    explicit function_output_iterator(const UnaryFunction& f);

    /* see below */ operator*();
    function_output_iterator& operator++();
    function_output_iterator& operator++(int);
  private:
    UnaryFunction m_f;     // exposition only
  };

[h3 Requirements]

`UnaryFunction` must be Assignable and Copy Constructible.  

[h3 Concepts]

`function_output_iterator` is a model of the Writable and
Incrementable Iterator concepts.

[h3 Operations]

  explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());

[*Effects: ] Constructs an instance of `function_output_iterator` 
  with `m_f` constructed from `f`.

  unspecified_type operator*();

[*Returns: ] An object `r` of unspecified type such that `r = t`
  is equivalent to `m_f(t)` for all `t`.
  

  function_output_iterator& operator++();

[*Returns: ] `*this`.


  function_output_iterator& operator++(int);

[*Returns: ] `*this`.

[endsect]