我试图使用可变参数模板找到平方和。输入参数是需要计算其平方和的数字。例如:foo(2, 3, 4)
应返回值27
(2+(9+16)
)。我的模板函数如下所示:
template<typename T>
T foo(T args)
{
return args*args;
}
template <typename T, typename... A>
T foo(T first, A... args)
{
return first+foo(pow(args,2)...);
}
然而,这个功能的结果似乎是261,这不是我的预期。
答案 0 :(得分:2)
简答:2 + 9 + 256 = 267
让我们扩展一下:
foo(2, 3, 4) => 2 + foo(pow(args, 2)...)
=> 2 + foo(pow(3, 2), pow(4, 2))
=> 2 + foo(9, 16)
=> 2 + (9 + foo(16))
=> 2 + (9 + 16 * 16)
=> 267
Hello world!
如果你想做得对,不要多次pow()
一个值:
template <typename T>
T foo(T arg)
{
return arg * arg;
}
template <typename T, typename... A>
T foo(T first, A... args)
{
return first * first + foo(args...);
// ^^^^^^^^^^^^^ or pow(first, 2)
}
答案 1 :(得分:1)
我试图使用可变参数模板找到平方和。输入参数是需要计算其平方和的数字。例如:foo(2,3,4)应返回值27(即2+(9 + 16))
玩的已经太晚了?
无论如何,如果你想找到平方和,foo(2, 3, 4)
应该返回4+9+16 = 29
,而不是27
。
我提出了一个非递归函数,在初始化未使用的整数数组时使用逗号运算符的强大功能
template <typename T, typename ... Ts>
T foo (T const & t, Ts const & ... ts)
{
using unused = int[];
T ret { t*t };
(void)unused { 0, (ret += ts*ts, 0)... };
return ret;
}
来自
std::cout << foo(2, 3, 4) << std::endl;
你得到29
如果您可以使用C ++ 17,则可以使用模板折叠,foo()
只需
template <typename ... Ts>
auto foo (Ts const & ... ts)
{ return ( (ts*ts) + ... ); }
答案 2 :(得分:0)
为了达到你在描述中所期望的结果,你需要在一个函数中捕获“第一个”,然后单独递归:
template<typename T>
T bar(T first) {
return first*first;
}
template<typename T, typename... A>
T bar(T first, A... args) {
return bar(first) + bar(args...);
}
template<typename T, typename... A>
T foo(T first, A... args) {
return first + bar(args...);
}
如果您希望对函数中的每个参数求平方并求它们,则应执行以下操作:
template<typename T>
T foo(T first) {
return first*first;
}
template<typename T, typename... A>
T foo(T first, A... args) {
return foo(first) + foo(args...);
}