Как и почему можно использовать сигналы Boost2?
Изучение c ++ и попытка познакомиться с некоторыми шаблонами.сигналы2 док Очевидно, что у меня есть огромный набор возможностей для слотов и сигналов. Что я не делаюЯ не понимаю, для каких типов приложений (случаев использования) я должен использовать это.
Я размышляю по принципу конечного автомата, отправляющего события изменения. Исходя из динамически типизированного фона (C #, Java и т. Д.), Вы 'd использовать диспетчер событий или статический ref или обратный вызов.
Есть ли трудности в c ++ с использованием кросс-классных обратных вызовов? Это по сутиЗачем сигналы2 существует?
Одним из примеров случаев является документ / представление. Как этот шаблон лучше подходит, чем, скажем, использовать вектор функций и вызывать каждую из них в цикле, или, скажем, лямбда-выражение, которое вызывает изменения состояния в зарегистрированных экземплярах класса прослушивания?
class Document
{
public:
typedef boost::signals2::signal 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;
};