我尝试了这个,以及它的一些变化:
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;
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.问题是我真的不知道期待作为参数或返回什么.关于这一点的标准对我来说是不可理解的,因为谷歌没有提出任何有用的东西,我想我并不孤单.
编辑:另一个尝试,使用C++ 0x:http://ideone.com/lMlyB
返回operator->*表示被调用过程中的一个函数,唯一缺少的部分是参数.因此,您必须返回一个仿函数,该仿函数使用给定的参数调用给定对象上的给定函数:
// PTMF = pointer to member function
template<class Obj>
struct PTMF_Object{
typedef int (Obj::*ptmf)(double,std::string); // example signature
PTMF_Object(Obj* obj, ptmf func)
: obj_(obj)
, func_(func)
{}
int operator()(double d, std::string str){
return (obj_->*func_)(d,str);
}
Obj* obj_;
ptmf func_;
};
template<class T>
struct SmartPtr{
// ...
PTMF_Object<T> operator->*(PTMF_Object<T>::ptmf func){
return PTMF_Object<T>(p, func);
}
// ...
};
int main(){
SmartPtr<Foo> pf(new Foo());
typedef int (Foo::*Foo_ptmf)(double,std::string);
Foo_ptmf method = &Foo::bar;
(pf->*method)(5.4, "oh hi");
}
Run Code Online (Sandbox Code Playgroud)
Edit2
以下是Scott Meyers关于这个主题的优秀pdf(这是关于重载的唯一优秀文献operator->*,尽管它来自1999年).
编辑
如果您的编译器支持可变参数模板,那么这是一个:http://ideone.com/B6kRF