c++ - 如何对多维 std::vector 的所有元素求和?

标签 c++ multidimensional-array metaprogramming stdvector

这个想法简单明了:
不断突破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 推断返回类型来绕过问题。 .

最佳答案

这可以在没有任何模板元编程的情况下完成。您可以让编译器使用 autodecltype 推断类型:

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 并且编译器知道该类型。

Demo

关于c++ - 如何对多维 std::vector 的所有元素求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44024453/

相关文章:

c++ - Sycl 内核调用非常慢

Char ** 使用和打印

arrays - 多维数组不允许我通过循环赋值?

c - 如何检查数组元素中是否存储了某些内容

ruby - 什么时候用undef_method,什么时候用remove_method?

c++ - For 遍历模板参数/类型

c++ - 可变参数模板推导错误

c++ - 如何知道 gcc 选择哪个函数重载

ruby - 在 Ruby 中序列化扩展的 String 类

c++ - 在 Haskell 项目中包含 C++ 源代码