C++类模板包装在宏中时"*"的参数太少

C++ too few arguments for class template "*" when it's wrapped in a macro

本文关键字:参数 包装 C++      更新时间:2023-10-16

这是我的代码。

#define mp_eval(Func)       Func::value
template<int L, int R>
struct StaticMinimum
{
    static const int value = (L < R) ? L : R;
};
// Error: too few arguments for class template "StaticMinimum"
cout << mp_eval(StaticMinimum<9, 12>) << endl;

mp_eval(StaticMinimum<9, 12>)不是要被编译器替换为StaticMinimum<9, 12>::value吗?我想我一定错过了什么。请让我知道发生了什么。

使用宏(mp_eval(StaticMinimum<9, 12>))时的逗号被解析为参数分隔符。

宏可以修复为:

#define mp_eval(...)       __VA_ARGS__::value

在 C++1y 中,您可以使用变量模板而不是宏。

预处理器将 9 到 12 之间的逗号视为宏的分隔参数。

表达式包装在附加()中以阻止此操作。

cout << mp_eval((StaticMinimum<9, 12>)) << endl;

更新:正如Ggicci在评论中指出的那样,在这种特定情况下,此解决方案是不可能的:它将导致(StaticMinimum<9, 12>)::value无效C++。