如何扩展 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]
};
所以我一直在努力学习更多关于 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]
};