这是我的代码。
#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
?我想我一定会错过一些东西。请让我知道发生了什么。
答案 0 :(得分:6)
使用宏(mp_eval(StaticMinimum<9, 12>)
)时的逗号被解析为参数分隔符。
宏可以修复为:
#define mp_eval(...) __VA_ARGS__::value
在C ++ 1y中,您可以使用变量模板而不是宏。
答案 1 :(得分:4)
预处理器将9和12之间的逗号视为将宏的参数分开。
将表达式包装在其他()
中以停止此操作。
cout << mp_eval((StaticMinimum<9, 12>)) << endl;
更新:正如Ggicci在评论中指出的那样,在这种特定情况下,这个解决方案是不可能的:它将导致(StaticMinimum<9, 12>)::value
无效的C ++。