可变模板张量 class

Variadic template tensor class

我正在尝试制作可变参数模板张量 class,并将类型和一组维度作为模板参数。

例如,创建一个包含 13 个浮点数的数组将使用 Tensor<float, 13> a;,创建一个三阶 3 x 4 x 5 双精度张量将使用 Tensor<double, 3, 4, 5> b;。这是针对 HPC 应用程序的。最终所有元素都需要追加到内存中,整个对象应该一次分配。

对象 Tensor<double, 3, 4, 5> 可能会有一个 std::array<Tensor<double, 3, 4>, 5> 类型的字段。

我在使用可变参数模板递归定义此类型时遇到问题。我目前正在尝试以下代码,但它无法编译,并且 运行 没有想法。我认为为 sizeof(n) == 0 添加专业化模板是朝着正确方向迈出的一步,但运气不佳。

#include <array>

template <typename T, int m, int ...n>
class Tensor {
public:
    std::array<Tensor<T, n>, m> a;
};

或者 a 可以只是一个 c 类型数组,其大小是 n 中元素的乘积。我将如何计算该乘积,同时仍保持未初始化张量的 Tensor<double, 3, 4, 5> b; 语法?

解决方案:

std::array<Tensor<T, n>, m> a; 应该是 std::array<Tensor<T, n...>, m> a; 并且 class 应该被重新定义,例如Tensor<float, 3> 合法。

您只需要扩展参数包即可。

#include <array>

template <typename T, int m, int ...n>
class Tensor {
public:
    std::array<Tensor<T, n...>, m> a;
};

std::array<Tensor<T, n>, m> a; 应该是 std::array<Tensor<T, n...>, m> a; 并且 class 应该被重新定义,例如Tensor<float, 3> 合法。