ISO C++的零参数变分宏



我写了这个可变宏template<>-maker。

#define TNAME0()
#define TNAME1(_1)        typename _1
#define TNAME2(_1,_2)     typename _1, typename _2
#define TNAME3(_1,_2,_3)  typename _1, typename _2, typename _3
#define TYPENAMES(_0,_1,_2,_3,n,...) TNAME##n
#define T(types...)   template< TYPENAMES(,##types,3,2,1,0)(types) >

它与GNU C++(例如T()T(U)T(U,V)…(配合得很好,但与使用ISO C++标准的0个参数(调用TYPES1而不是TYPES0(配合不好。

是否有适用于GNU和ISO c++的修复程序?

这个可变宏语法根本不是标准C++:

#define T(types...)

相反,您可以使用未命名的...,它在扩展中由__VA_ARGS__引用。由于C++20,只有当...不为空时,您也可以使用__VA_OPT__(,)来包含初始,

#define T(...)   template< TYPENAMES(__VA_OPT__(,) __VA_ARGS__,3,2,1,0)(__VA_ARGS__) >

最新更新