C++ を学習し、いくつかのパターンに慣れようとしています。シグナル2 のドキュメントには、スロットとシグナルを使ってできることの膨大な配列が明確に記載されています。私が理解していないのは、どのタイプのアプリケーション (ユースケース) に使用する必要があるかということです。
私は、変更イベントをディスパッチするステート マシンに沿って考えています。動的に型付けされたバックグラウンド (C#、Java など) から来ると、イベント ディスパッチャーまたは静的参照またはコールバックを使用します。
C++ でクロスクラス コールバックを使用する際に問題はありますか? それが本質的にsignals2が存在する理由ですか?
例の 1 つはドキュメント/ビューです。このパターンは、関数のベクトルを使用してループ内で各関数を呼び出したり、登録されたリッスン クラス インスタンスの状態変更を呼び出すラムダを使用したりするよりも、どのように適していますか?
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;
};