如何从长度为 N 的参数包创建堆栈 ND C 数组?

问题描述 投票:0回答:1

对于参数包

size_t ...len
,例如
[len={3,5,2}
,我想创造

double x[3][5][2];

问题

有没有一种简单的方法可以做到这一点?

备注

我希望仍然能够大量使用“维度滥用”

x[i][j][k] == x[0][0][i*5*2+j*2+k] == (*(x+i))[j][k]

我尝试了什么

我目前的尝试是:

template<typename Tfloat, int...> struct ARRAY_TYPE;

template<typename Tfloat, int len, int ...lens>
struct ARRAY_TYPE<Tfloat,len,lens...>{
    using type = typename ARRAY_TYPE<Tfloat,lens...>::type[len];
};

template<typename Tfloat>
struct ARRAY_TYPE<Tfloat>{
    using type = Tfloat;
};

但我不知道这是否会产生完全相同的构造类型。 恐怕不支持“维度滥用”。 有没有办法将上述类型的 x 重新解释为我类型的 y

ARRAY_TYPE<double,len...>
? (这至少使我能够测试行为差异。)

或者是否存在一种高效的三点语法,可以通过

len...
中的单行表达式来获取所查找的类型(除了我繁琐的 ARRAY_TYPE 实现之外)?

c++ multidimensional-array parameter-pack
1个回答
0
投票

你的意思是这样的吗?请注意,我不会为此使用“C”样式数组(arryas 的最终 std::array 在内存中应该仍然是连续的)

#include <array>
#include <type_traits>

namespace details
{
    template<typename type_t, std::size_t dim, std::size_t... dims>
    auto deduce_md_type()
    {
        if constexpr (sizeof...(dims) == 0ul)
        {
            return std::array<type_t,dim>{};
        }
        else
        {
            return std::array<decltype(deduce_md_type<type_t,dims...>()),dim>{};
        }
    }
}

template<typename type_t, std::size_t...dims>
using md_array_t = decltype(details::deduce_md_type<type_t,dims...>());

int main()
{
    md_array_t<int, 2, 3, 4> values{};
    static_assert(std::is_same_v<md_array_t<int, 2, 3, 4>, std::array<std::array<std::array<int,4>,3>,2>>);

    values[1][2][3] = 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.