Я не уверен, что это лучшее решение, которое вы можете получить, так как, возможно, будут лучшие проекты, во всяком случае, вы можете использовать метапрограммирование для запуска создания и регистрации функций:
// in a single cpp file
namespace {
template <unsigned int N>
int register_a() { // return artificially added
register_a<N-1>(); // Initialize array from 0 to N-1
regf::v[N] = &a<N>::f; // and then N
return N;
}
template <>
int register_a<0>() {
regf::v[0] = &a<0>::f; // recursion stop condition
return 0;
}
const int ignored = register_a<regf::arrsize>(); // call it
}
Этот код будет создавать экземпляры функций и регистрировать указатели на статические функции-члены.Поддельный тип возврата требуется, чтобы иметь возможность принудительно выполнять функцию в статическом контексте (посредством использования этой функции для инициализации статического значения).
Это весьма склонно к фиаско статической инициализации.Хотя regf::v
в порядке, любой код, который зависит от regf::v
, содержащий соответствующие указатели во время статической инициализации, обязательно завершится с ошибкой.Вы можете улучшить это с помощью обычных методов ...
Из кусочков, которые вы на самом деле опубликовали, я предполагаю, что вы пытаетесь использовать абстрактную фабрику с автоматической регистрацией на каждой конкретной фабрике.,Существуют лучшие способы решения проблемы, но я думаю, что этот ответ решит ваш вопрос (я не уверен, решит ли это вашу проблему).