在c#中,我们有event关键字,这是一种特殊的委托,只能通过声明它的类来调用。那么,有没有办法在原生c++中使用boost::signals2来做到这一点,如果有,从性能的角度看是否昂贵?
发布于 2011-09-19 10:27:11
一般而言,限制C++函数可调用性的方法依赖于传递一个类型的伪参数,该类型要么不能在该类外部实例化(私有工厂或带有目标类的'friend‘声明的构造函数)。
但是,将其应用于boost::signals2::signal将导致具有无关参数的信号定义。
如果你真的需要让它不可调用,请记住它只是一个对象成员(至少在我使用它的时候是这样的)--你可以将它声明为一个私有或受保护的成员,并提供一个公共函数来连接它。
class FooEmitter
{
public:
boost::signals2::scoped_connection ConnectToFoo(boost::function<void (Emitter&)>& handler)
{
return fooSignal.connect(handler);
}
void triggerFoo() {
fooSignal(*this);
}
private:
boost::signals2::signal<void (Emitter&)> fooSignal;
};
class FooHandler
{
public:
FooHandler()
{
fooConnection = getAnEmitter().ConnectToFoo(boost::bind(&FooHandler::HandleFoo, this, _1);
}
void HandleFoo(Emitter&)
{
// handler body
}
private:
boost::signals2::scoped_connection fooConnection;
}当然,如果您的模型足够严格,您可以重新安排ConnectToFoo方法以获取一个FooHandler&并在其中进行绑定。
至于性能方面,通过一个好的编译器,虚拟类型实际上是自由的,并且这种机制是每个处理程序(而不是每个信号)一个或两个额外的函数调用。
https://stackoverflow.com/questions/7465790
复制相似问题