Я сгенерировал некоторые типы с помощью внешнего инструмента. Я включаю некоторые из них в зависимости от приложения. Я попытался поиграть как с препроцессором boost, так и с mpl, чтобы пометить мои сгенерированные типы и построить вектор mpl этих помеченных типов.
К сожалению, мой трюк работает только тогда, когда я включаю нужные заголовки в один файл с моим TypeRegistry.
// TypeRegistry.h
typedef ::boost::mpl::vector<> TypeRegistryRegisteredTypes0;
# define TYPE_REGISTRY_REGISTER_TYPE(T) \
typedef ::boost::mpl::push_back< \
BOOST_PP_CAT( \
TypeRegistryRegisteredTypes, \
BOOST_PP_COUNTER \
), \
##T \
>::type \
BOOST_PP_CAT(TypeRegistryRegisteredTypes, BOOST_PP_ADD(BOOST_PP_COUNTER,1))
# define TYPE_REGISTRY_SYNC_REGISTERED_TYPES() \
typedef BOOST_PP_CAT( \
TypeRegistryRegisteredTypes, \
BOOST_PP_COUNTER \
) TypeRegistryRegisteredTypes
template
<
class RegisteredTypesBase,
class RegisteredTypesVector
>
class TypeRegistry { ... };
Это макрос, который я использую для регистрации типа.
// A.h
class A : public IBase { ... };
TYPE_REGISTRY_REGISTER_TYPE(A);
#include BOOST_PP_UPDATE_COUNTER()
Здесь мы в исходном файле говорим main.h
:
#include "TypeRegistry.h"
#include "A.h"
#include "B.h"
#include "C.h"
...
TYPE_REGISTRY_SYNC_REGISTERED_TYPES();
TypeRegistry< IBase, TypeRegistryRegisteredTypes > typeRegistry;
auto a = typeRegistry.instanceFromName("A");
auto b = typeRegistry.instanceFromName("B");
auto c = typeRegistry.instanceFromName("C");
Как я уже сказал, уловка работает только потому, что я включаю все свои интересные типы - так сказать - одновременно.
Как бы вы выполнили автоматическую запись типа без необходимости включать их все в один файл (то есть достаточно компилировать исходный файл, включающий заголовочный файл)?