学习 c++ 并尝试熟悉一些模式。信号2文档显然有很多我可以用槽和信号做的事情。我不明白我应该将它用于什么类型的应用程序(用例)。
我正在按照状态机调度更改事件的思路进行思考。来自动态类型的背景(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;
};
和
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;
};