可变模板张量 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>
合法。
我正在尝试制作可变参数模板张量 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>
合法。