【发布时间】:2019-11-28 20:32:34
【问题描述】:
是否有任何语法可以在编译时定义静态数组的维度?假设我有一个大小为 D 的元组,其值为 d_0,...,d_{D-1}。我希望能够创建一个数组T arr[d_0][d_1]...[d_{D-1}]。有没有办法在编译时实现这一点?我专门询问静态数组语法,而不是如何嵌套结构。
这是一个代码 sn-p 来阐明我想要实现的目标:
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;
我很好奇这是否可以通过某种形式的语法来实现,而无需嵌套类。
【问题讨论】:
-
tuple中的值在编译时是否已知(是constexpr)? -
另外,你会接受
std::array来代替原始数组吗? -
@NathanOliver 不,我特意询问的是一个普通的静态数组。元组是编译时间。
-
似乎您正在搜索某种宏来生成尺寸括号。但是我怀疑在编译时是否存在一种通用的填充括号方法,而无需明确地对每组可能的数组维度进行硬编码
-
范围是来自实际的
std::tuple对象,还是像MultiArr<float, 3, 3, 3>示例中那样以逗号分隔的列表形式输入?
标签: c++ arrays c++17 compile-time