我想实现一个类似于 Unreal 4 中的 verify
的函数,如果某个表达式不正确,则打印表达式中使用的标记和一些变量。
这是一个案例:
int x = ...;
long y = ...;
Verify( x > y, "check-range", x, y);
Verify( y < INT_MAX, "check-range:y", x, y, INT_MAX);
我想的解决方案是使用函数 Verify
,我想将所有参数连接到宏 GET_STRING_FROM_PARAMETERS
中的一个字符串。但是我没有弄清楚如何将可变参数参数从模板化函数传递给宏。
代码如下:
#define GET_STRING_FROM_PARAMETERS(...) \
do { \
if (...) { \
something to be done \
} \
} while (false)
template <typename... Ts>
constexpr void Verify(bool expression, const std::string &tag, Ts &&... rest) noexcept {
if (!expression) {
std::cout << tag << " " << GET_STRING_FROM_PARAMETERS(rest...);
}
}
答案 0 :(得分:2)
由于多种原因,您的代码无法编译。您正在使用宏 a 函数,同时它包含一个 while 语句,您将参数包直接传递给它,不能像在循环中那样使用参数包。
您不能将参数包传递给宏,因为预处理发生在编译代码之前。宏定义不知道模板。你必须使用一个技巧来保持正确的语法:
#define PARAMETER_PACK(x) x...
#define SOME_OTHER_MACRO(x) auto lm = \
[&, PARAMETER_PACK(x)] { return foo(PARAMETER_PACK(x)); }
SOME_OTHER_MACRO(Args);
省略号不能是函数宏的参数列表的一部分。它可以是该列表中表达式的一部分,因此在某些情况下您也可以这样做:
#define SOME_OTHER_MACRO(x) g x;
SOME_OTHER_MACRO((Args ...));
在这两种情况下,这是一种有限且奇怪的方式,最好根本不要在此类模板中使用宏定义。如果必须,请使用较小的辅助模板。