我希望能够在 C++ 中使用类似 Java 的接口语义。起初,我曾经boost::signal
为给定的事件回调显式注册的成员函数。这非常有效。
但后来我决定一些函数回调池是相关的,将它们抽象并立即注册所有实例的相关回调是有意义的。但我了解到的是,boost::bind
和/或取值的特定性质this
似乎打破了这一点。或者也许只是add_listener(X &x)
方法声明改变了boost::bind
生成的代码的事实。
我对问题发生的原因有一个非常粗略的理解,我认为它可能按照其设计正常运行。我很好奇:我应该怎么做呢?当然有一个正确的方法来做到这一点。
这是一些示例代码:
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <iostream>
using namespace std;
struct X;
struct Callback
{
virtual void add_listener(X &x) = 0;
};
struct X
{
X() {}
X(Callback &c) { c.add_listener(*this); }
virtual void go() { cout << "\t'" << __PRETTY_FUNCTION__ << "'" << endl; }
};
struct CallbackReal : public Callback
{
virtual void add_listener(X &x)
{
f = boost::bind<void>(boost::mem_fn(&X::go), x);
}
void go() { f(); }
boost::function<void (void)> f;
};
struct Y : public X
{
Y() {}
Y(Callback &c) { c.add_listener(*this); }
virtual void go() { cout << "\t'" << __PRETTY_FUNCTION__ << "'" << endl; }
};
int main(void)
{
CallbackReal c_x;
CallbackReal c_y;
X x(c_x);
Y y(c_y);
cout << "Should be 'X'" << endl;
boost::bind<void>(boost::mem_fn(&X::go), x)();
cout << "Should be 'Y'" << endl;
boost::bind<void>(boost::mem_fn(&X::go), y)();
cout << "------------------" << endl;
cout << "Should be 'X'" << endl;
c_x.go();
cout << "I wish it were 'Y'" << endl;
c_y.go();
return 0;
}
好吧,我没有完全描述这个问题。标题具有误导性。
天啊。否决这个。我显然没有很好地描述这个问题,我认为这最终归结为主要是一个语法错误。:(