On Wed, May 15, 2013 at 6:07 PM, Oliver Kowalke
OK - some simple code:
struct B { virtual void run() = 0; };
template< typename Fn > struct D : public B { Fn fn;
D( Fn fn_) : fn( fn_) {}
void run() { fn(...) } // argument construction omitted };
struct X { B * b;
template< typename Fn > X( Fn fn) : b( 0) { b = new D< Fn >( fn); }
void run() { b->run(); } };
Constraints to Fn: returns void and has only one argument. I need to know in X::X() or D::run() what's the first and only argument of Fn.
It doesn't follow from the code above. If D is the same for all Fns then I don't see how D can discover the type (and value) of the argument to pass. The way your design looks it seems the other way around - it is D who defines the argument type and value, and Fn should be able to accept it.
I believe the problem should be solvable - for function pointers it is easy, X() could be overloaded with function<>. The only remaining issue are objects created by bind() and passed to the ctor - I thought overloading X() with the type returned by bind() should work?!
No, bind function object types do not have the argument types. These types are not known until the function object is actually invoked. The only types you will find is the bound function object type and bound argument values types (and the latter may differ from the actual argument types, BTW).