我已经编写了带有递归评估的可变参数模板函数。对于最后一个参数,我实现了没有可变参数包的专业化,并且一切正常。
现在,我想将可变参数函数参数转换为模板参数。
这是我的尝试:
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'。
如该答案所述,可变参数包确实可以是空的。但是您可以使用SFINAE专门处理非空可变参数包的情况。
例如:
#include <iostream>
#include <type_traits>
template<typename N, int p> // specialization
N constexpr myadd(const N &n)
{
std::cout << "specialization" << std::endl;
return n + p;
}
template<typename N, int p, int ... v, class = std::enable_if_t<(sizeof...(v) > 0)>> // variadic
N constexpr myadd(const N &n)
{
std::cout << "variadic" << std::endl;
return myadd<N, v...>(n) + p;
}
int main()
{
std::cout << myadd<int, 2>(7) << std::endl;
std::cout << myadd<int, 2, 4>(7) << std::endl;
return 0;
}
看到它住在Coliru。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句