Fla*_*ape 20 c++ events boost boost-signals2
学习c ++并尝试熟悉一些模式.该signals2 DOC显然有事情,我可以插槽和信号做繁多.我不明白的是我应该使用哪种类型的应用程序(用例).
我正在考虑调度变更事件的状态机.来自动态类型的背景(C#,Java等),您将使用事件调度程序或静态引用或回调.
使用跨类回调在c ++中是否存在困难?这就是为什么信号2存在的原因?
示例案例之一是文档/视图.这种模式如何比使用函数向量并在循环中调用每个函数更好地适用,或者说在注册的侦听类实例中调用状态更改的lambda?
class Document
{
public:
typedef boost::signals2::signal<void ()> signal_t;
public:
Document()
{}
/* Connect a slot to the signal which will be emitted whenever
text is appended to the document. */
boost::signals2::connection connect(const signal_t::slot_type &subscriber)
{
return m_sig.connect(subscriber);
}
void append(const char* s)
{
m_text += s;
m_sig();
}
const std::string& getText() const
{
return m_text;
}
private:
signal_t m_sig;
std::string m_text;
};
Run Code Online (Sandbox Code Playgroud)
和
class TextView
{
public:
TextView(Document& doc): m_document(doc)
{
m_connection = m_document.connect(boost::bind(&TextView::refresh, this));
}
~TextView()
{
m_connection.disconnect();
}
void refresh() const
{
std::cout << "TextView: " << m_document.getText() << std::endl;
}
private:
Document& m_document;
boost::signals2::connection m_connection;
};
Run Code Online (Sandbox Code Playgroud)
Igo*_* R. 27
Boost.Signals2
它不仅仅是"一系列回调",它还有很多附加价值.IMO,最重要的一点是:
connection
和scoped_connection
句柄允许断开连接而无需直接访问signal
.请注意,这是断开无法比较的插槽的唯一方法,如boost::function
(或std::function
).自动插槽寿命跟踪:信号自动从"过期"插槽断开.考虑当插槽是引用由shared_ptr
s 管理的不可复制对象的绑定器时的情况:
shared_ptr<listener> l = listener::create();
auto slot = bind(&listener::listen, l.get()); // we don't want aSignal_ to affect `listener` lifespan
aSignal_.connect(your_signal_type::slot_type(slot).track(l)); // but do want to disconnect automatically when it gets destroyed
Run Code Online (Sandbox Code Playgroud)当然,人们可以自己重新实现上述所有功能"使用函数向量并在循环中调用每个函数"等,但问题是如何更好Boost.Signals2
.重新发明轮子很少是一个好主意.