Я пробовал это, и некоторые вариации на нем:
template<class T>
class Ptr {
public:
Ptr(T* ptr) : p(ptr) {}
~Ptr() { if(p) delete p; }
template<class Method>
Method operator ->* (Method method)
{
return p->*method;
}
private:
T *p;
};
class Foo {
public:
void foo(int) {}
int bar() { return 3; }
};
int main() {
Ptr<Foo> p(new Foo());
void (Foo::*method)(int) = &Foo::foo;
int (Foo::*method2)() = &Foo::bar;
(p->*method)(5);
(p->*method2)();
return 0;
}
Но он не работает. Проблема в том, что я действительно не знаю, чего ожидать в качестве параметра или что вернуть. Стандарт на этом мне непонятен, и поскольку Google ничего не помог, я думаю, что я не один.
Изменить: Еще одна попытка с С++ 0x: http://ideone.com/lMlyB