如何重载 - >*运算符?

Foz*_*ozi 16 c++

我尝试了这个,以及它的一些变化:

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

Xeo*_*Xeo 8

返回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