有些情况下,您需要(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将多个模板参数传递给一个fixture
TEST_CASE_METHOD()
)。