【发布时间】:2018-04-19 19:28:15
【问题描述】:
在某些情况下,您需要 (a) 有一个宏,该宏 (b) 在 (c) 语言不允许括号的情况下将其参数之一括起来。
简单示例:
#define MAKE_STRUCT(name, base) struct name : base { }
struct X { };
MAKE_STRUCT(Y, X); // ok
MAKE_STRUCT(Z, (X)); // error
这是一个错误,因为我们需要一个类型名称并且我们得到(。 ecatmur 利用语言的其他部分确实允许额外的括号集这一事实,为此提供了一个巧妙的解决方法:
template<typename T> struct argument_type;
template<typename T, typename U> struct argument_type<T(U)> { typedef U type; };
#define MAKE_STRUCT(name, base) struct name : argument_type<void(base)>::type { }
struct X { };
MAKE_STRUCT(Y, X); // ok
MAKE_STRUCT(Z, (X)); // ok
这可以在 gcc 和 clang 上编译,但不能在 MSVC 上编译。是否存在允许使用括号的特定于 MSVC 的技巧或适用于所有三个编译器的不同技巧?
这个可能带括号的类型通过几个宏传递 - 所以我不确定其他答案是否适用(这里的上下文是尝试使用 Catch2 的 TEST_CASE_METHOD() 将多个模板参数传递给夹具)。
【问题讨论】:
-
@VTT 不。没有这样的运气。
标签: c++ visual-c++ macros