这个想法简单明了:
不断突破n
维度 vector 为n-1
维组成 vector ,直到您可以访问原始数据类型对象。然后将它们全部添加。
问题是,如何推断返回类型?
可以这样做,但它已经假定求和变量的数据类型(返回类型):
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;
}
但我不想像上面那样做。我觉得这违背了元编程的精神。
我们必须通过不断将 vector 分解为其组成 vector 来推断返回类型,直到到达原始数据类型对象,然后选择返回类型作为原始数据类型。
在 C++ 中可以吗? (我是元编程新手)
附注
std::accumulate()
来自<numeric>
可能会有帮助,但它通过从第三个参数 __init
推断返回类型来绕过问题。 .
最佳答案
这可以在没有任何模板元编程的情况下完成。您可以让编译器使用 auto
和 decltype
推断类型:
template <class T>
T Sum(const T x) {
return x;
}
template <class T>
auto Sum(const std::vector<T> &v) {
decltype(Sum(v[0])) sum = 0;
for (const auto &x : v)
sum += Sum(x);
return sum;
}
Sum
的返回类型是从 sum
自动推导出来的,sum
的类型为 Sum(v[0] )
返回。最终您将得到 Sum
的第一个版本,它返回 T
并且编译器知道该类型。
关于c++ - 如何对多维 std::vector 的所有元素求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44024453/