2017-09-13 65 views
0

我有一個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

想不到一個辦法。看起來像一個不幸的提升預處理器宏的工作。 –

回答

1

恐怕你不能在模板擴展中做到這一點,但你可以乾淨利落地干預並使用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。這樣你就不會污染全局名稱空間。 –