個人的には手動登録道路を利用しています。登録を忘れた場合...テストはとにかく機能しません。
ファクトリを使用し、タグディスパッチを実装するだけです。例えば:
typedef void (*ActOnMessageType)(Message const&);
typedef std::map<std::string, ActOnMessageType> MessageDispatcherType;
static MessageDispatcherType& GetDispatcher() {
static MessageDispatcherType D; return D;
}
static bool RegisterMessageHandler(std::string name, ActOnMessageType func) {
return GetDispatcher().insert(std::make_pair(name, func)).second;
}
次に、関数を準備します。
void ActOnFoo(Message const& m);
void ActOnBar(Message const& m);
そしてそれらを登録します:
bool const gRegisteredFoo = RegisterMessageHandler("Foo", ActOnFoo);
bool const gRegisteredBar = RegsiterMessageHandler("Bar", ActOnBar);
注:デカップリングを可能にするために、遅延初期化されたシングルトンを効果的に使用します。つまり、登録はライブラリのロード中に行われるため、各Register...
呼び出しは関数が定義されているファイルに配置されます。グローバル変数との1つの違いは、初期化が終了すると、ディスパッチングマップが実際には一定であるということです。