【发布时间】:2017-10-16 21:25:18
【问题描述】:
这个想法简单明了:
继续将n 维向量分解为n-1 维构成向量,直到您可以访问原始数据类型对象。然后将它们全部添加。
问题是,如何推断返回类型?
可以这样做,但是已经假设了求和变量的数据类型(return-type):
typedef int SumType;
template <class T>
T Sum (const T x)
{
return x;
}
template <class T>
SumType Sum (const std::vector<T>& v)
{
SumType sum = 0;
for (const auto& x: v)
sum += Sum(x);
return sum;
}
但我不想像上面那样做。我觉得它违背了元编程的精神。
我们必须通过不断将向量分解为其组成向量来推断返回类型,直到我们到达原始数据类型对象,然后选择返回类型作为原始数据类型。
在 C++ 中可以吗? (我是元编程的菜鸟)
P.S.<numeric> 中的std::accumulate() 可能会有所帮助,但它通过从第三个参数 __init 推断返回类型来绕过问题。
【问题讨论】:
-
SumType 在编译时必须是可推断的,就像模板一样,编译器知道要生成哪些函数原型。您可以查看
decltype以从基础数据中定义 SumType 的返回值。要获得更灵活的解决方案,请考虑将基础数据包装到变体类中,例如脚本语言。 -
你可能想要
SumType sum {}。没有明显的理由假设数字 0 可以转换为SumType。
标签: c++ multidimensional-array metaprogramming stdvector