On Tue, Oct 18, 2011 at 3:54 PM, Vicente Botet <vicente.botet@wanadoo.fr> wrote:
How is make_generator different from bind?
Why
function<T()> g = bind(f,v);
Doesn't works for you?
Hi Vicente
Thanks for answering. My initial response was "Doh, I've asked a really stupid question here.", which may still
be true! But walk a little with me on this...
In this code sequence
#include <vector>
#include <iostream>
#include "boost/assign/std/vector.hpp"
#include "boost/function.hpp"
#include "boost/bind.hpp"
using boost::function;
using boost::bind;
void do_it( function<void()> f ) { f( ); }
void print( int i ) { std::cout << i << std::endl; }
template <typename T, typename T1> function<T( )> make_generator( function<T(T1)> f, T1 t1 ) { return bind( f, t1 ); }
template <typename T, typename T1, typename T2> function<T( )> make_generator( function<T(T1, T2)> f, T1 t1, T2 t2 ) { return bind( f, t1, t2 ); }
template <typename T, typename T1, typename T2, typename T3> function<T( )> make_generator( function<T(T1, T2, T3)> f, T1 t1, T2 t2, T3 t3 ) { return bind( f, t1, t2, t3 ); }
// ...etc...
int main( )
{
using namespace boost::assign;
std::vector<int> v;
v += 1,2,3,4,5,6,7;
for_each( v.begin(), v.end(), bind( do_it, bind( make_generator<void, int>, print, _1 ) ));
}
...how would you write the final for_each using bind directly, given that the other
interfaces are fixed? I think you'd need to specify the exact types taken
and returned by bind, which are less than convenient to work with.
So I think the answer to 'doesn't bind work for me?', is no, because I'd like
specify the template instantiation types in a more convenient way.
That may all be a load of gibberish - I'm feeling my way a bit here!
Also, if my function signature handling skills were better, it might be better to specify
the template parameter(s) of make_generator as a function signature or MPL type
list.
Thx, Rob.