首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++升压信号2

c++升压信号2
EN

Stack Overflow用户
提问于 2011-09-19 09:57:37
回答 1查看 1.6K关注 0票数 2

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-19 10:27:11

一般而言,限制C++函数可调用性的方法依赖于传递一个类型的伪参数,该类型要么不能在该类外部实例化(私有工厂或带有目标类的'friend‘声明的构造函数)。

但是,将其应用于boost::signals2::signal将导致具有无关参数的信号定义。

如果你真的需要让它不可调用,请记住它只是一个对象成员(至少在我使用它的时候是这样的)--你可以将它声明为一个私有或受保护的成员,并提供一个公共函数来连接它。

代码语言:javascript
运行
复制
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&并在其中进行绑定。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7465790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档