使用变异模板的正方形总和
Sum of squares using variadic templates
我正在尝试使用variadic模板找到正方形的总和。输入参数是需要计算正方形之和的数字。例如: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,这不是我所期望的。
简短答案: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)
}
我正在尝试使用variadic模板找到正方形的总和。输入参数是需要计算正方形之和的数字。例如: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) + ... ); }
要达到您所期望的结果,您需要在一个函数中捕获"首先",然后以这样的单独重复:
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...);
}
相关文章:
- 试试完美的正方形,你能给点小费吗
- 迭代器在递增和递减时是否保证会变异?
- OpenGL绘制三角形而不是正方形
- 在 OpenGL 中旋转一个正方形
- (C++) 解密自定义的波利比乌斯正方形
- 使用变异模板的正方形总和
- 具有与行模板的变异模板扩展有关的EIGEN
- 2个模板构造函数的组合构建与变异模板.如何
- 具有变异模板模板参数的方法的部分专业化
- 我无法完全理解这段代码来检查一个完美的正方形
- 调用每种类型的变异模板的正确模板专业化
- 扣除指南和变异模板
- 匹配的变异非类型模板
- 隐藏变异模板实现
- 检查指针是否是带有变异模板的派生的指针
- 我如何实现变异模式以将可变数量的参数转发到C 11中的函数
- 编写一个函数,用递归函数检查数字是否是正方形
- 变异模板中的功能顺序
- 组合类模板默认参数和变异参数
- 继承具有变异参数的构造函数