Я лично пользуюсь ручной регистрацией дороги. Если вы забыли зарегистрироваться ... то тест все равно не работает.
Вам просто нужно использовать фабрику и реализовать некоторую диспетчеризацию тегов. Например:
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...
помещается в файл, в котором определена функция. Единственное отличие от глобальной переменной заключается в том, что здесь карта диспетчеризации фактически постоянна после завершения инициализации.