如何在编译时标记某些类型以从这些标记类型构建类型列表?

时间:2011-04-24 13:52:45

标签: c++ templates boost c-preprocessor

我使用外部工具生成了一些类型。我根据应用程序包含其中一些。我尝试使用boost预处理器和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");

正如我所说,这个伎俩才有效,因为我同时包含了所有有趣的类型 - 也就是说 - 。 如何在不必将它们全部包含在一个文件中的情况下执行自动类型记录(也就是说,编译包含其头文件的源文件应该足够了)?

0 个答案:

没有答案