【发布时间】:2020-11-24 11:00:31
【问题描述】:
我写了一个带有递归计算的可变参数模板函数。对于最后一个参数,我实现了一个没有可变参数包的专业化,一切正常。
现在我想将可变参数函数参数转换为模板参数。
这是我的尝试:
template<typename N, int p> // specialization
N constexpr myadd(const N &n)
{
return n + p;
}
template<typename N, int p, int ... v> // variadic
N constexpr myadd(const N &n)
{
return myadd<N, v...>(n) + p;
}
int testfun()
{
return myadd<int, 2>(7);
}
gcc 和 clang 报告了一个模棱两可的重载,并且无法在 'specialization' 和 'variadic' 使用空参数包之间做出决定。
我尝试删除特化并检查可变参数模板中的包大小,但没有特化编译器无法推断出参数“p”。 p>
【问题讨论】:
-
请注意,没有特化,只是不同的重载。