C ++包含在宏中的类模板“*”的参数太少

时间:2014-04-03 10:47:46

标签: c++ templates macros template-meta-programming

这是我的代码。

#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?我想我一定会错过一些东西。请让我知道发生了什么。

2 个答案:

答案 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 ++。