イベントのフックアップ/関数のディスパッチを可能にするために、ブーストシグナル/シグナル2をしばらく使用しています。
問題なく動作しますが、2 つの問題があります。
-これはよりマイナーなものですが、切断の処理は苦痛になる可能性があります. 私は追跡可能なクラスを使用してこれを支援していますが、それですべてが解決するわけではありません。任意の時間に信号を切断したい場合に接続を追跡する必要があるのも少し面倒です
-これは大きい方です。シグナルをコピーする方法はありません。つまり、シグナルをクラスに追加するたびにコピー コンストラクターを実装する必要があり、クラスをコピーすると、イベントがフックされなくなります。明らかな解決策は、保持されているシグナルをポインターにすることです。これにより、コピーおよび共有が可能になりますが、これは汚くて悪い形に感じられます。
上記を考慮して、代替案を探し始めましたが、上記の問題はシグナル ライブラリに共通しているようです。上記の問題を回避するための提案があるかどうか疑問に思っていました。おそらくそれらに直接対処する方法です。
また、ブースト信号を使い始める前に、元のソリューションに戻ることも検討していました。このようなもの:
boost::unordered_map<std::string, boost::function>
boost::function がスロット/コールバックの代わりになります。次に、このマップを保持するクラスに Dispatch 関数を追加します。このマップは、ループして各 boost::function を呼び出します。このアプローチにより、コールバックをいつでも簡単に削除でき、マップをコピーできます。これは良い方法ではないと言われましたが、今見てみると、ここに問題があることがわかりません。
さらに、Variadic テンプレートがあるので、このマップの周りに小さなクラスを作成して、マップへの Dispatch/Add/Remove コールバック呼び出しを処理するのは簡単な作業です。
これは悪いアプローチですか?