代码之家  ›  专栏  ›  技术社区  ›  Belfer4

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

  •  2
  • Belfer4  · 技术社区  · 8 年前

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

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

    2 回复  |  直到 8 年前
        1
  •  3
  •   max66    8 年前

    我建议你使用 std::array 而是自定义数组或旧的C样式数组。

    如果你想要一个变量列表 std::数组 ,您可以使用 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; };
    

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

        2
  •  2
  •   Igor Tandetnik    8 年前

    你可能在寻找这样的东西:

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