通过C ++ 11中的更改(例如包含std::bind
),是否存在一种推荐的方法来实现简单的单线程观察者模式,而无需依赖于核心语言或标准库(例如boost::signal
)?
编辑
[如果有人发布一些代码来显示如何使用新的语言功能来减少对boost::signal
的依赖,那将仍然非常有用。
我认为bind
使创建槽位变得更加容易(参见'preferred' syntax vs. the 'portable' syntax-一切都将消失)。但是,观察者的管理并没有变得那么复杂。
std::vector<std::function< r(a1) > >
,而无需为(人工)“纯虚拟”接口类麻烦。这是一个简短的用法示例:
Signal<void (std::string, int)> sig2;
sig2() += [] (std::string msg, int d) { /* handler logic */ };
sig2.emit ("string arg", 17);
我的库中明显缺乏支持的是从调用中获得返回值的能力。我相信boost :: signal具有计算总返回值的方法。在实践中,通常您不需要这样做,而我只是觉得它很混乱,但是将来我可能会想出一种返回方法来使之有趣,例如练习。
关于我的类的一件很酷的事情是Slot和SlotRegister类。 SlotRegister提供了一个公共接口,您可以安全地链接到一个专用插槽。这样可以防止外部对象调用观察者方法。它很简单,但是封装不错。
https://gist.github.com/4172757
我使用不同的样式,与BOOST信号相比,它更类似于JUCE中的更改通知。连接管理是使用一些lambda语法完成的,该语法通过副本进行捕获。到目前为止,它运行良好。
这假定不需要汇总广播信号的侦听器的结果。同样,“ slot”或Signal :: Listener是回调的所有者。这应该与您(我猜...)lambda可能捕获的对象一起使用,以便当该对象超出范围时,回调也将超出范围,从而防止再次调用它。
您也可以使用其他答案中描述的方法,以可以查找的方式存储侦听器所有者对象。