如何扩展 class 模板整数列表?

How to expand on a class template integer list?

所以我一直在努力学习更多关于 c++ 元编程的知识,但我一直在尝试设计一个变长数组的元组。

我想做的事情的想法是这样的:

CustomArrays<float, 3, 2> arrays;

第一个参数“float”是数组将存储的数据类型。下面的参数是每个数组的长度。我可以制作一个采用这些参数的结构:

template <typename T, uint... As> struct CustomArrays {};

我知道如果我只接受一个参数而不是一个列表,我可以像这样存储数组:

template <typename T, uint A> struct CustomArrays { T data[A]; };

这就是我想要的,但是带有扩展的子类,类似于元组可以做的。我在想一些事情:

template <typename T, uint A> struct CustomArrays {};

template <typename T, uint A, uint... As>
struct CustomArrays : CustomArrays<T, As...> {
    T data[A];
};

想法是像这样展开:

struct CustomArrays<float, 2, 3> : CustomArrays<float, 3> {
    float data[2];
}

struct CustomArrays<float, 3> : CustomArrays {
    float data[3];
}

struct CustomArrays {}

这当然不会编译,因为我们用不同的模板参数重新声明了相同的结构。我的问题是如何才能达到预期的结果。

我建议您使用 std::array 而不是自定义数组或旧的 C 风格数组。

如果你想要一个 std::array 的可变列表,你可以使用 std::tuple 并编写类似

的内容
template <typename T, std::size_t ... Dims>
struct CustomArrays
 { std::tuple<std::array<T, Dims>...> data; };

您也可以尝试使用 C 风格的数组

template <typename T, std::size_t ... Dims>
struct CustomArrays
 { std::tuple<T[Dims]...> data; };

但我认为这不是个好主意。

您可能正在寻找这样的东西:

template <typename T, uint... As> struct ArrayType;

template <typename T>
struct ArrayType<T> {
    typedef T type;
};

template <typename T, uint A, uint... As>
struct ArrayType<T, A, As...> {
    typedef typename ArrayType<T, As...>::type type[A];
};

template <typename T, uint... As>
struct CustomArrays {
  typename ArrayType<T, As...>::type data;
  // CustomArrays<float, 3, 2>::data is of type float[3][2]
};