关于绑定成员函数C ++的非法操作

时间:2018-04-05 00:28:00

标签: c++ c++11 member-function-pointers

所以我正在尝试创建一个事件类来镜像C#事件。我已经看到了几个实现过于涉及我需要的实现。我想出了符合我目的的以下内容:

template <typename TFunc>
class Event;

template <class RetType, class... Args>
class Event<RetType(Args...)> final
{
    typedef typename std::function<RetType(Args ...)> Closure;
  public:
    void operator+=(Closure c)
    {
      observers.push_back(c);
    }

    void operator()(Args... args)
    {
        for (auto closure : observers)
            closure(args...);
    }

  private:
    std::vector<Closure> observers;
};

这可以按预期使用:

void Dosomething()
{
    cout << "Did something" << endl;
}
int DosomethingCrazy(int i)
{
    cout << "Did something Crazy " << i << endl;
    return i;
}

int main()
{  
    Event<void()> e1;
    Event<int(int)> e2;
    e1 += Dosomething;
    e2 += DosomethingCrazy;
    e1();
    e2(5);
}

但是,如果我尝试在对象中订阅一个函数,我会收到错误:'&': illegal operation on bound member function expression,即:

class Myclass
{
public:
int num;
Myclass(int i) : num(i) { }
void Dosomething()
{
    cout << "Did something" << num << endl;
}
int DosomethingCrazy(int i)
{
    num = i;
    cout << "Did something Crazy " << num << endl;
    return i;
}
};

int main()
{
Myclass a(0);
Myclass b(10);

Event<int(int)> e1;
Event<int(int)> e2;
e1 += &(a.DosomethingCrazy);  //Error
e2 += &b.DosomethingCrazy;  //Same Error

e1(10);
e2(0);

return 0;
}

我已经决定:即使我能够实现这一点,允许外部代码订阅对象的内部方法也许是一个坏主意。

然而,我很好奇究竟是什么让这一点及其原因无法实现。另外,有没有办法实现这一点,我的语法错了?

注意:这当然可以通过静态函数实现并使用类限定函数,但我需要能够专门引用该对象。如在示例中,'a'和'b'应该以交换的整数值结束。

0 个答案:

没有答案