2

在 c# 中,我们有 event 关键字,它是一种特殊的委托,只能从声明它的类中调用。那么,有没有办法在本机 C++ 中使用 boost::signals2 来做到这一点,如果是这样,从性能的角度来看它是否昂贵?

4

1 回答 1

3

通常,限制 C++ 函数可调用性的方法依赖于传递无法在该类之外实例化的类型的虚拟参数(私有工厂或具有目标类的“朋友”声明的构造函数)。

但是,将其应用于 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& 并在其中进行绑定。

至于性能方面,虚拟类型通过良好的编译器实际上是免费的,并且这种机制是每个处理程序(而不是每个信号)一次或两次额外的函数调用。

于 2011-09-19T02:27:11.387 回答