我写了这个可变参数宏template<>
-制造商。
#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__) >
关于c++ - ISO C++ 的带有零参数的可变参数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70918629/