Я не знаю, подходит ли это вашему шаблону, но для ссылок на функции-члены boost :: bind и boost :: phoenix уже делают то, что вы хотите:
struct T
{
void f(int) const {}
};
T instance;
T* pointer = new T();
boost::shared_ptr<T> shared(new T());
boost::bind( & T:f, instance, 1); // stores instance by value
boost::bind( & T:f, boost::ref(instance), 2); // stores instance by ref
boost::bind( & T:f, boost::cref(instance), 3); // stores instance by const ref
boost::bind( & T:f, pointer, 4); // dereferences the pointer
boost::bind( & T:f, shared, 5); // dereferences the smart pointer
_Вы даже можете использовать типизацию, чтобы сообщить boost :: bind / phoenix о вашем собственном умном указателе (или любом типе, на который вы хотите разыменовать с помощью оператора * и оператора-> при использовании) _