From what I'm compiling, you want to call Y::call_it() std::function object, appropriately related. Given that your inner function accepts a different number of arguments, you need to create a std::function<bool()> generator for cases when additional arguments are passed. Assuming that an object X can be bound during registration, registering a member function without additional arguments is straightforward:
template <int Magic, typename RC> void register_call(RC (X::*member)()) { somewhere->register_call<Magic>( std::bind(&Y::call_it, this, std::function<bool()>(std::bind(member, std::ref(this->x_))))); }
When passing one or more arguments, you must create the std::function<bool()> object during the call, because the additional argument must be bound. I do not think that this can be done without a helper function, but this can be done with a single helper function for the number of arguments:
template <typename RC, typename Arg0> static std::function<bool()> bind_argument(RC (X::*member)(Arg0), X& x, Arg0 const& arg0) { return std::bind(member, std::ref(x), arg0); } template <int Magic, typename RC, typename Arg0, typename PlaceHolder> void register_call(RC (X::*member)(Arg0), PlaceHolder pc) { somewhere->register_call<Magic>( typename some_traits_type<Magic>::type( std::bind(&Y::call_it, this, std::bind(&bind_argument<RC, Arg0>, member, std::ref(this->x_), pc)))); }
A helper function creates a function with an optional argument bound. Note that the associated function is constructed in the same way as the register function: this is necessary, for example, to create a function with additional ignored arguments.
Below is a test program that I used to see if things compiled. I donโt have a C ++ 2003 compiler with TR1 at hand and compiled code with a C ++ 2011 compiler. However, I donโt think I used any C ++ 2011 extension that is not available in C ++ 2003 with TR1.
#include <functional> enum { MAGIC_OK, MAGIC_FAILED, MAGIC_FOO, MAGIC_BAR, MAGIC_FBZ, MAGIC_BAZ }; template <int> struct server_traits; template <> struct server_traits<MAGIC_FOO> { typedef std::function<bool()> type; }; template <> struct server_traits<MAGIC_BAR> { typedef std::function<bool(std::string&)> type; }; template <> struct server_traits<MAGIC_FBZ> { typedef std::function<bool(long)> type; }; template <> struct server_traits<MAGIC_BAZ> { typedef std::function<bool(std::string, long)> type; }; // this I just use class server { public: template<unsigned int MagicTag> bool register_call(typename server_traits<MagicTag>::type) { return true; } }; server s; server* somewhere = &s; // this needs to be called from the server class X { public: bool foo() { return true; } bool bar(std::string&) { return true; } bool baz(int) { return true; } }; // this is the glue class Y { public: Y(X& x) : x_(x) { register_call<MAGIC_FOO>(&X::foo ); register_call<MAGIC_BAR>(&X::bar, std::placeholders::_1); register_call<MAGIC_FBZ>(&X::baz, std::placeholders::_1); register_call<MAGIC_BAZ>(&X::baz, std::placeholders::_2); } private: X& x_; int call_it(std::function<bool()> f) { return f() ? MAGIC_OK : MAGIC_FAILED; } template <int Magic, typename RC> void register_call(RC (X::*member)()) { somewhere->register_call<Magic>( std::bind(&Y::call_it, this, std::function<bool()>(std::bind(member, std::ref(this->x_))))); } template <typename RC, typename Arg0> static std::function<bool()> bind_argument(RC (X::*member)(Arg0), X& x, Arg0 const& arg0) { return std::bind(member, std::ref(x), arg0); } template <int Magic, typename RC, typename Arg0, typename PlaceHolder> void register_call(RC (X::*member)(Arg0), PlaceHolder pc) { somewhere->register_call<Magic>( typename server_traits<Magic>::type( std::bind(&Y::call_it, this, std::bind(&bind_argument<RC, Arg0>, member, std::ref(this->x_), pc)))); } }; int main() { X x; Y y(x); }