Я создал систему, которая автоматически регистрирует функциональные объекты (функторы) на карте на основе конструктора глобального экземпляра.
В каждом файле cpp, определяющем функтор, есть глобальный экземпляр экземпляра класса регистратора для регистрации функтора в одноэлементном std :: map
объект.
Это определение класса регистратора:
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(cmd_code, handler));
}
};
в каждом файле .cpp. Глобальный экземпляр определяется следующим образом:
namespace one_way
{
static registrar
post_receiver(in_out_map_type::instance(), command, handlers());
}
Все работает нормально, если я скомпилирую все cpp вместе с main.cpp. Но если я скомпилирую файл cpp в статическую библиотеку и свяжу его с main.cpp
, регистрация не сработает.
Я тестировал VC10 и GCC4.61 как в Windows, так и в Ubuntu 11.10. Оба терпят неудачу.
Я нашел поток с той же проблемой , но OP не сказал, решил он ее или нет.
Я что-нибудь упускаю?
Редактировать
Спасибо за все ответы, включая комментарии.
Каждый ответ действительно помог мне больше думать и глубже исследовать этот метод. После всех исследований и испытаний я, наконец, отказался от идеи полагаться на глобальную / статическую переменную для саморегистрации через границы двоичного кода , потому что нет переносимого способа гарантировать, что это будет работать .
Мой последний способ - сохранить регистрацию в одном двоичном файле.