我写了这个可变宏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__) >