【问题标题】:How to expand on a class template integer list?如何扩展类模板整数列表?
【发布时间】:2017-11-07 14:23:59
【问题描述】:

所以我一直在努力学习更多关于 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 {}

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

【问题讨论】:

    标签: c++ c++11 metaprogramming variadic-templates template-meta-programming


    【解决方案1】:

    我建议您使用 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; };
    

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

    【讨论】:

    • 这正是我所需要的,我真的很惊讶使用标准来实现它是多么简单。谢谢!
    • @Belfer4 - 如果(何时)可以,请使用 C++17:使用折叠表达式,可变参数的使用要简单得多。
    【解决方案2】:

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

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

    【讨论】:

    • 这是一个有趣的设计,但不是我需要的。这形成了一个 3x2 数组,我只想要两个数组在长度为 3 和 2 的连续内存中,即 float[3];浮动[2];。感谢您提供替代方法!
    • template &lt;typename T, uint... As&gt; struct CustomArrays { std::tuple&lt;T[As]...&gt; data; }; 那么?
    • 是的,这行得通。但我认为这基本上相当于第一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2021-12-28
    • 2014-12-17
    相关资源
    最近更新 更多