Как пометить некоторые типы для создания списка типов из этих помеченных типов во время компиляции? - PullRequest
1 голос
/ 24 апреля 2011

Я сгенерировал некоторые типы с помощью внешнего инструмента. Я включаю некоторые из них в зависимости от приложения. Я попытался поиграть как с препроцессором 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");

Как я уже сказал, уловка работает только потому, что я включаю все свои интересные типы - так сказать - одновременно. Как бы вы выполнили автоматическую запись типа без необходимости включать их все в один файл (то есть достаточно компилировать исходный файл, включающий заголовочный файл)?

...