对于参数包
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”样式数组(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;
}