考虑这个宏:
#define MAKE_TEMPLATE(...) template <typename T, __VA_ARGS__ >
当与零参数一起使用时,它会产生错误的代码,因为编译器期望逗号后面有一个标识符。实际上,VC 的预处理器足够聪明,可以删除逗号,但 GCC 的则不然。
由于宏不能重载,因此对于这种特殊情况似乎需要一个单独的宏才能正确实现,如下所示:
#define MAKE_TEMPLATE_Z() template <typename T>
有什么方法可以让它在不引入第二个宏的情况下工作吗?
不,因为宏调用MAKE_TEMPLATE()
根本没有零参数;它有一个由零个标记组成的参数。
较旧的预处理器(显然包括最初编写此答案时的 GCC)有时会如您所希望地解释一个空参数列表,但共识已转向更严格、更窄的扩展,更符合标准。
要使下面的答案起作用,请在省略号之前定义一个附加宏参数:
#define MAKE_TEMPLATE(UNUSED, ...) template <typename T, ## __VA_ARGS__ >
然后当列表不为空时,始终在第一个参数之前添加逗号:
MAKE_TEMPLATE(, foo )
旧答案
根据http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html,GCC确实支持这一点,只是不透明。
语法是:
#define MAKE_TEMPLATE(...) template <typename T, ## __VA_ARGS__ >
不管怎样,两者都支持 C++0x 模式下的可变模板,这是更可取的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)