C++中的通知中心

问题描述:

在使用iOS和Mac客观C框架编程了一段时间后,我开始喜欢由NSNotificationCenter和NSNotification类实现的通用通知模式。回到C++,它一直是我对大多数事物的选择语言,我发现自己试图复制这种模式,并相信应该真的有一个类似的C++类的通用实现,为它提供支持。C++中的通知中心

由于后者的动态性更强,似乎这种模式在C++中实现起来比Objective C更难实现,但看起来远不可能。我已经浏览了boost库,因为它们通常很棒,并且很遗憾不能在那里找到我的运气。虽然boost :: bind,boost :: lamda,boost :: function看起来像是他们做的大部分工作。我错过了明显的东西吗?有没有可以让我轻松复制NSNotification/NSNotificationCenter行为的东西?

+0

你试过Boost.signals吗? – anno

+0

我会看看,谢谢你的建议。 – jbat100

+0

通过稍微不同的方法,Qt通过专用的预处理工具(moc 元对象编译器)实现了“信号和插槽”。但是,如果qt ui符合您的需求,则仅使用它是合理的。 –

遵循@ anno的建议来查看boot :: signal,它在检查之后看起来像是一个可能的选项,尽管如预期的那样,它不像客观的C解决方案那样直截了当。纵观boost::signal tutorial,我认为我会针对手头的问题审视最相关的方面。


要创建通知发件人:

考虑一个简单的新闻发送服务,其中客户端连接到新闻提供者然后发送消息的所有连接的客户端的信息到达。新闻递送服务可以构建这样的:

class NewsItem { /* ... */ }; 
boost::signal<void (const NewsItem&)> deliverNews; 

deliverNews目的是通知观察者,一个NewsItem已经产生。


观察员可以添加如下(使用了boost ::绑定库):

客户希望接收新闻更新只需要连接一个函数对象,可以接收新闻项目到了deliverNews信号。例如,我们可以在我们的应用程序的特殊消息区域专门用于新闻,例如,:

struct NewsMessageArea : public MessageArea 
{ 
public: 
    // ... 

    void displayNews(const NewsItem& news) const 
    { 
    messageText = news.text(); 
    update(); 
    } 
}; 

// ... 
NewsMessageArea newsMessageArea = new NewsMessageArea(/* ... */); 
// ... 
deliverNews.connect(boost::bind(&NewsMessageArea::displayNews, newsMessageArea, _1)); 

为了解决除去已经从列表中释放观察员的问题,提高::信号提供以下解决方案:

但是,如果用户关闭新闻消息区域,破坏了deliveryNews知道的newsMessageArea对象呢?很有可能会出现 分段错误。但是,有了Boost.Signals,需要 才能使NewsMessageArea跟踪,并且当newsMessageArea被 销毁时,newsMessageArea的插槽将断开连接。该的newsMessageArea班由可追踪由升压::信号::可追踪类,例如派生 公开:

struct NewsMessageArea : public MessageArea, public boost::signals::trackable 
{ 
    // ... 
}; 

这时有是在使用可追踪 对象的显著限制创建插槽连接:使用 构建的函数对象被理解,以便发现并跟踪传递给boost :: bind的可跟踪对象的指针或引用。

从理论上讲,您可以创建一个具有调用某个通知时调用的函数指针向量的类 - 一个具有一个字典的类,其中的对象是推送通知时要调用的函数的向量

除了在其他答案中提到的boost包,另一个选项是poco::NotificationCenter

此实现更接近于可可通知框架,作为在波索的documentation具体讨论:

的通知中心类基本上是一个C++实现在苹果的可可(或OpenStep的)中发现的 NSNotificationCenter类的。