Ознакомьтесь с ответом на «Лучший способ составить список данных по типу»
Здесь есть два ключевых важных понятия. Во-первых:
(void) register_object;
использует объект, чтобы компоновщик не удалял его, и,
template<typename D> typename automatic_register<D>::exec_register
automatic_register<D>::register_object;
гарантирует, что статический глобал выделяется для каждого экземпляра. Вы должны хранить свои данные в этом объекте. Он немного отличается тем, что для каждого объекта, а не для класса, но если вы адаптируете свой макрос для создания
// Global list of objectsh
struct FpList
{
FpList( FuncPtr func ) :
func(func)
{
head = next;
next = this
}
FpList* next;
FuncPtr func;
static FpList* head;
};
// In .cxx:
FpList* FpList::head = 0;
Затем измените ваш регистр макросов так, чтобы REGISTER (Foo), чтобы он создавал:
struct register_Foo : FpList
{
register_Foo( FuncPtr fn ): FpList(fn)
{
(void) register_object;
}
static register_Foo register_object;
};
Я думаю, этого недостаточно. Вам все еще нужно создать экземпляр шаблона, передать if & Foo и убедиться, что
register_Foo register_Foo::register_object
экземпляр создан где-то. Код шаблона для Automatic_register показывает, как это сделать в заголовке. Если вы можете поместить свой макрос в .cxx, просто объявите:
register_Foo register_Foo::register_object( &Foo );
как часть вашего макроса. Я думаю, что это может сработать. (все по памяти, так что кто знает).