繁体   English   中英

如何在类模板整数列表上展开?

[英]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]
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM