【发布时间】:2021-04-16 12:57:02
【问题描述】:
我总是对在 C++ 中初始化默认数组感到不安,所以我想像在 python 中一样创建一个 ndarray 类。
但是我遇到了一个障碍,我找不到任何关于如何制作这种代码的信息
...
// for 1-d
ndArray(std::initializer_list<T> list){
...
}
// for 2-d
ndArray(std::initializer_list<std::initializer_list<T>> list){
...
}
// for 3-d
ndArray(std::initializer_list<std::initializer_list<std::initializer_list<T>>> list){
...
}
...
任何嵌套初始化列表的通用(!)
想要的结果是通过以下方式构造 ndarray:
ndArray arr = {{1,0,0},{0,1,0},{0,0,1}};
编辑: 我认为我对正确强调正确的词有点不好,但是我想在没有明确为每个维度编写代码的情况下概括这一点
编辑:
我想我现在得到了正确的想法,但还没有完全做到。 感谢@Nicholas Pilotto,但在你的情况下,它会产生这些类
// one-dimensional
ndArray<int> first;
// two-dimensional
ndArray<ndArray<int>> second;
// .. and so on
如果您需要 3 维数组,则需要嵌套这些数组。这对用户来说是不可取的。我认为它以某种方式涉及模板构造函数
template<typename T>
class ndArray {
template<typename N>
ndArray(std::initializer_list<N> list) {
// do stuff there
}
}
但它以某种方式涉及知道模板 N 的“深度”以确定 ndArray 的维数。也许有办法用模板做到这一点?
【问题讨论】:
-
你只需要为一维数组实现它,提供一个带有
std::initializer_list<T>的构造函数。如果你然后创建一个ndArray<ndArray<T>>对象,它将提供一个std::initializer_list<ndArray<T>>(本质上是std::initializer_list<T_>和T_ = ndArray<T>)构造函数,它可以满足你的需求。
标签: c++ templates containers initializer-list