【问题标题】:How to create a multi dimensional std::array using a template?如何使用模板创建多维 std::array?
【发布时间】:2021-10-11 22:26:36
【问题描述】:

如何使用一些智能可变参数模板“MDA”创建具有(当然)已知初始constexpr 维度的Type 类型的多维std::array

维度的数量应该是可变的。

最后我希望能写:

MDA<int,3,4,5,6> a4d{};

结果应该等于

std::array < std::array < std::array < std::array<int, 6> , 5 > , 4 > , 3 > a4d{};

并节省大量(复杂的,甚至容易出错的)打字工作。 . .


编辑:

我不确定这是否可能。但我正在寻找的是一些“打字保护程序”,可能与 using 声明结合使用。

【问题讨论】:

  • 我不禁注意到,您的每一个其他 "How to..." 问题都清楚地显示了实施的尝试,而这似乎确实是更像是一个请求,而不是关于某个具体障碍的问题。因此,我猜是投票结束。
  • 嗯,由于我不是以英语为母语的人,我可能会误解您的评论。我真诚地问我的问题。我尝试了许多令人尴尬的事情,但我找不到解决方案。所以,我向社区寻求帮助。我希望在 SO 上允许这样做。如果我有不当行为,我将删除该问题。虽然我对解决方案很感兴趣。 . .显然,“如何”的问题显然不好。我不明白这其中的微妙之处,但以后会尽量避免这种情况

标签: c++ arrays templates variadic-templates


【解决方案1】:

当然可以使用帮助类模板,C++11(静态断言部分除外)

#include <array>

template<typename T, std::size_t Head, std::size_t... Tail>
struct MDA_impl{
    using type = std::array<typename MDA_impl<T, Tail...>::type, Head>;
};
// Base specialization
template<typename T, std::size_t N>
struct MDA_impl<T,N>{
    using type = std::array<T, N>;
};

template<typename T, std::size_t... Ns>
using MDA = typename MDA_impl<T,Ns...>::type;

int main(){
    static_assert(std::is_same_v<MDA<int,3,4,5,6>,
                  std::array<std::array<std::array<std::array<int, 6>,5>,4>,3>>);
}

【讨论】:

    【解决方案2】:

    你可以使用所谓的meta-functions

    template<class T, int N, int... M>
    struct MDA_struct
    {
        using type = std::array<typename MDA_struct<T, M...>::type, N>;
    };
    
    template<class T, int N>
    struct MDA_struct<T, N>
    {
        using type = std::array<T, N>;
    };
    
    template<class T, int... N>
    using MDA = typename MDA_struct<T, N...>::type;
    

    【讨论】:

    • 您不能重载using 语句。但是您的想法是正确的,只需使用结构和部分专业化来实现细节。
    • 代码现在应该可以正常工作了,见godbolt.org/z/ff6TnfEz7
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2019-11-19
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多