升压MPL - 声明一个类的序列中的每个类型

问题描述:

我有一个boost :: MPL顺序是这样的:升压MPL - 声明一个类的序列中的每个类型

typedef boost::mpl::vector< 
    char, unsigned char, short, unsigned short, int, unsigned int, float, double 
> TTypes; 

我有我想从我的DLL导出一个特定用途的容器类:

template<typename T> 
class Container { T* _elements; } 

现在我需要在我的头(MSVC编译器)是几行这样的:

template class __declspec(dllexport) Container<char>; 
template class __declspec(dllexport) Container<short>; 

等(我需要的同样,但为了包括这个库的客户端的dllimport)。

现在我的问题是,有没有办法从我的mpl向量生成这些行?

我怀疑这是不可能的,所以我的回退:有没有办法让预处理器为我做这个?那么,是否有任何(boost)宏会以某种方式遍历序列中的元素(如果我必须使用一些特殊的语法来定义序列,这很好),以便我可以在预处理器字符串中使用类型名称做些事情?

+0

想不到一个办法。看起来像一个不幸的提升预处理器宏的工作。 –

恐怕你不能在模板扩展中做到这一点,但你可以干净利落地干预并使用boost预处理器。

#include <boost/preprocessor.hpp> 

/* 
* define the variants as a tuple 
*/ 
#define VARIANTS (char, unsigned char, short, unsigned short, int, unsigned int, float, double) 

/* 
* our enumeration function which defines an export 
*/ 
#define MAKE_EXPORT(r, data, elem) template class __declspec(dllexport) Container<elem>; 

/* 
* enumerate cast the tuple to a sequence and enumerate, calling MAKE_EXPORT once for each enumeration 
*/ 
BOOST_PP_SEQ_FOR_EACH(MAKE_EXPORT, _, BOOST_PP_TUPLE_TO_SEQ(VARIANTS)) 
+0

太好了,谢谢 - 那会工作。 – Roel

+0

@Roel奖励积分,#undef头文件末尾的宏MAKE_EXPORT和VARIANTS。这样你就不会污染全局名称空间。 –