所以我正在尝试创建一个事件类来镜像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'应该以交换的整数值结束。