我有一个C ++ Windows应用程序。我正在处理发布者 - 订阅者的情况,其中我的一个类(发布者)定期生成数据并将其交给另一个类(订阅者),该类经常等待接收来自发布者的通知。我是设计模式的新手,我查找了发布者订阅者模型的常见实现,我注意到它们通常很老,而且它们通常涉及维护指向对象的指针列表。我想知道是否有更好的方法使用C ++ 11编写发布者订阅者模型。或者使用完全不同的模型代替发布者 - 订阅者。 如果您可以命名一些有趣的功能或方法,我会阅读它们的文档,编写实现并将其添加到此处以供进一步检查。
更新:我说我会发布示例代码。首先,Jens推荐的Boost Signals 2真的很棒。我的代码与http://www.boost.org/doc/libs/1_55_0/doc/html/signals2/tutorial.html
上的初学者部分没有太大区别答案 0 :(得分:3)
查看信号库,例如Boost.Signals2或libsigc++。它们提供了一个抽象来定义类中客户端可以连接的信号。所有存储连接的逻辑都在那里实现。
答案 1 :(得分:3)
你可以存储一个函数向量,这里有一个快速而又脏的方法:
template<class T>
class dispatcher
{
std::vector<std::function<void(T)> > functions;
public:
void subscribe(std::function<void(T)> f)
{
functions.push_back(f);
}
void publish(T x)
{
for(auto f:functions) f(x);
}
};
这没有取消订阅(您必须使用地图)。
但是,这不是线程安全的。如果您想要线程安全,那么您应该Boost.Signals2。
答案 2 :(得分:1)
好吧,如果你想要现代的,非常现代的替代品,或许除了像Jens所提到的Boost.Signals2之外,你可以试试functional reactive programming范例。