Я создал систему, которая автоматически регистрирует объекты функции (функторы) в карту на основе конструктора глобального экземпляра.
В каждом файле cpp, который определяет функтор, есть глобальный экземпляр экземпляра класса регистратора для регистрации функтора для объекта singleton std::map<int, std::function<...> >
.
Это определение класса регистратора:
template
<
typename map_type,
typename handler_type
>
struct registrar
{
registrar
(
map_type& map_object,
boost::uint16_t cmd_code,
const handler_type& handler
)
{
map_object.insert(std::pair<boost::uint16_t, handler_type>(cmd_code, handler));
}
};
в каждом файле .cpp. Глобальный экземпляр определяется следующим образом:
namespace one_way
{
static registrar <in_out_map_type, handler>
post_receiver(in_out_map_type::instance(), command, handlers());
}
Все работает отлично, если я скомпилирую все cpp вместе с main.cpp. Но если я скомпилирую файл cpp в статическую библиотеку и привяжу его к main.cpp
, регистрация не будет работать.
Я тестировал VC10 и GCC4.61 как на Windows, так и на Ubuntu 11.10. Оба не работают.
Я нашел поток с той же проблемой, но OP не сказал, решил ли он это или нет.
Я что-то пропустил?
Edit
Спасибо за ответы, включая комментарии.
Каждый ответ действительно помог мне больше подумать и глубоко изучить этот метод. После всех исследований и испытаний я, наконец, отказался от идеи полагаться на глобальную/статическую переменную для саморегистрации по двоичным границам, потому что нет портативного способа гарантировать это будет работать.
Мой последний способ - сохранить регистрацию в пределах одного двоичного файла.