c++ - ISO C++ 的带有零参数的可变参数宏

标签 c++ g++ iso variadic-macros

我写了这个可变参数宏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/

相关文章:

android - JodaTime - 如何将 ISO 8601 时间字符串解析为 DateTime?

c++ - 很长的编译时间

c++ - operator new 是否在异常后破坏初始化的对象?

使用 -D 选项时 gcc 编译器错误

makefile - mt19937 不是 std 的成员 可能的 makefile 问题

ISO 8859-1 或 Unicode 中的 JavaScript 变量名称

c++ - 无法重载 + 运算符来添加 2 个对象

c++ - 深层复制构造函数中的问题

c++ - 为什么 g++ 会生成巨大的错误日志?