#include #include #include #define ITEMS(c) c.begin(),c.end() template class Increment { public: T arg; Increment( T a ) : arg(a) {} template T operator() ( T& value, OutIt out ) { value+=arg; *out++ = value; return 1; } }; template class Functor { public: OP & op; Functor( OP & o ) : op(o) {} // we cannot put the OutIt template here, because the functor is virtual virtual int operator() ( int& v, OutIt out ) = 0; }; /* It is painfull to declare a Functor's derivate class with all the templates * because C++ can't infer templates from parameters of the constructor. * Thus, we rely on this helper free function, where templates can be infered. * * Instead of having to write: * Assign, std::back_insert_iterator > > f(add_one); * We can just write: * auto f = make_Functor( add_one, std::back_inserter(v)); */ template< template< class, typename > class FC, class OP, typename OutIt > FC& make_Functor( OP & op, OutIt /*out*/ ) { return *(new FC(op)); } template class Assign : public Functor { public: Assign( OP & o ) : Functor(o) {} virtual int operator() ( int& value, OutIt out ) { // std::clog << value << " + " << this->op.arg << std::endl; return this->op(value,out); } }; int main(void) { size_t nb = 10000; for( unsigned int k=0; k v; auto out = std::back_inserter(v); Increment add_one(1); // we specify the output iterator here, just for type inference auto f = make_Functor(add_one, out); int i = -1; size_t n = 0; for( unsigned int j=0; j( std::cout, "\n") ); } }