我正在尝试编写一个可变参数模板 constexpr
计算给定模板参数总和的函数。这是我的代码:
template<int First, int... Rest>
constexpr int f()
{
return First + f<Rest...>();
}
template<int First>
constexpr int f()
{
return First;
}
int main()
{
f<1, 2, 3>();
return 0;
}
不幸的是,在尝试解析 f<3,>()
调用时,它不会编译报告错误消息 error C2668: 'f': ambiguous call to overloaded function
。
我还尝试更改我的递归基本案例以接受 0 个模板参数而不是 1:
template<>
constexpr int f()
{
return 0;
}
但是此代码也无法编译(消息 error C2912: explicit specialization 'int f(void)' is not a specialization of a function template
)。
我可以提取第一个和第二个模板参数以使其编译和工作,如下所示:
template<int First, int Second, int... Rest>
constexpr int f()
{
return First + f<Second, Rest...>();
}
但这似乎不是最好的选择。所以,问题是:如何以优雅的方式编写这个计算?
UP :我也尝试将其编写为单个函数:
template<int First, int... Rest>
constexpr int f()
{
return sizeof...(Rest) == 0 ? First : (First + f<Rest...>());
}
这也不起作用: error C2672: 'f': no matching overloaded function found
。
原文由 alexeykuzmin0 发布,翻译遵循 CC BY-SA 4.0 许可协议
你的基本情况是错误的。您需要一个空列表的案例,但正如编译器所建议的那样,您的第二次尝试不是有效的模板特化。为零参数定义有效实例化的一种方法是创建一个接受空列表的重载
编辑:为了完整起见,也是我的第一个答案,@alexeykuzmin0 通过添加条件来修复: