静态多维数组,编译时维度定义
Static multidimensional array, dimensionality definition at compile time
有什么语法可以在编译时定义静态数组的维数吗?假设我有一个大小为 D 的元组,其值为 d_0,...,d_{D-1}
。我希望能够创建一个数组 T arr[d_0][d_1]...[d_{D-1}]
。有没有办法在编译时实现这一点?我特别询问静态数组语法,而不是如何嵌套结构。
这里有一个代码片段来阐明我想要实现的目标:
template<typename T, template<typename, auto> typename Container, auto DimC, auto...Dim>
struct NestedContainer
{
using type = Container<typename NestedContainer<T, Container, Dim...>::type, DimC>;
};
template<typename T, template<typename, auto> typename Container, auto Dim>
struct NestedContainer<T, Container, Dim>
{
using type = Container<T, Dim>;
};
template<typename T, int D>
struct Arr
{
T e[D];
T& operator[](int i) { return e[i]; }
};
template<typename T, int D, int...Dim>
struct MultiArr
{
using multi_arr = typename NestedContainer<T, Arr, Dim...>::type;
multi_arr e[D];
auto& operator[](int i) { return e[i]; }
};
这样使用:
MultiArr<float, 3, 3, 3> a;
a[2][2][2] = 3;
我很好奇这是否可以通过某种形式的语法而不嵌套来实现 类。
使用模板元编程递归可以轻松完成。唯一棘手的事情是您需要以正确的顺序应用范围。请注意 int[x][y]
是(概念上)(int[y])[x]
.
#include <cstddef>
#include <type_traits>
template <typename E, size_t... extents>
struct MultiArrHelper;
template <typename E>
struct MultiArrHelper<E> {
using type = E;
};
template <typename E, size_t extent, size_t... extents>
struct MultiArrHelper<E, extent, extents...> {
using type = typename MultiArrHelper<E, extents...>::type[extent];
};
template <typename E, size_t... extents>
using MultiArr = typename MultiArrHelper<E, extents...>::type;
int main() {
MultiArr<int, 2, 2, 3> a;
static_assert(std::is_same<decltype(a), int[2][2][3]>::value);
}
有什么语法可以在编译时定义静态数组的维数吗?假设我有一个大小为 D 的元组,其值为 d_0,...,d_{D-1}
。我希望能够创建一个数组 T arr[d_0][d_1]...[d_{D-1}]
。有没有办法在编译时实现这一点?我特别询问静态数组语法,而不是如何嵌套结构。
这里有一个代码片段来阐明我想要实现的目标:
template<typename T, template<typename, auto> typename Container, auto DimC, auto...Dim>
struct NestedContainer
{
using type = Container<typename NestedContainer<T, Container, Dim...>::type, DimC>;
};
template<typename T, template<typename, auto> typename Container, auto Dim>
struct NestedContainer<T, Container, Dim>
{
using type = Container<T, Dim>;
};
template<typename T, int D>
struct Arr
{
T e[D];
T& operator[](int i) { return e[i]; }
};
template<typename T, int D, int...Dim>
struct MultiArr
{
using multi_arr = typename NestedContainer<T, Arr, Dim...>::type;
multi_arr e[D];
auto& operator[](int i) { return e[i]; }
};
这样使用:
MultiArr<float, 3, 3, 3> a;
a[2][2][2] = 3;
我很好奇这是否可以通过某种形式的语法而不嵌套来实现 类。
使用模板元编程递归可以轻松完成。唯一棘手的事情是您需要以正确的顺序应用范围。请注意 int[x][y]
是(概念上)(int[y])[x]
.
#include <cstddef>
#include <type_traits>
template <typename E, size_t... extents>
struct MultiArrHelper;
template <typename E>
struct MultiArrHelper<E> {
using type = E;
};
template <typename E, size_t extent, size_t... extents>
struct MultiArrHelper<E, extent, extents...> {
using type = typename MultiArrHelper<E, extents...>::type[extent];
};
template <typename E, size_t... extents>
using MultiArr = typename MultiArrHelper<E, extents...>::type;
int main() {
MultiArr<int, 2, 2, 3> a;
static_assert(std::is_same<decltype(a), int[2][2][3]>::value);
}