【发布时间】:2018-11-20 05:28:54
【问题描述】:
由于某些原因,我必须在 C++ 中实现一个多维数组类。 有问题的数组是这样的:
template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
class Array final
{
private:
std::vector<size_t> shape_;
std::vector<T> data_;
public:
// Some public methods
}
T 是存储在数组中的元素的类型,并且数组的维度不是模板化的,因为用户应该能够重塑数组,例如:
Array<int> array = Array<int>::zeros(3, 2, 4);
array.reshape(4, 6);
虽然上面提到的函数的实现很顺利,但我还是停留在了实现这个类的“开始”,也就是初始化数组... 我的问题如下:
-
有没有这样的构造函数,这样不同深度的嵌套初始化列表创建不同的数组,比如:
Array<int> a = {1, 2}; // Dimension: 1, Shape: 2 Array<int> b = {{1}, {2}}; // Dimension: 2, Shape: 2x1我实现构造函数的方法使这两个数组相同,这不是我想要的。另外,clang 抱怨支撑标量,这似乎是问题所在。目前,我遇到上述问题的幼稚方法看起来像这样
... Array() :data_(0), shape_{0} {} Array(std::initializer_list<T> list) :data_(list), shape_{list.size()} {} Array(std::initializer_list<Array> lists) { // Implementation } ... -
编译器很容易推断出以下数组的类型:
Array c = {1, 2}; // T = int Array d = {1.0, 2.0}; // T = double但我没能写出多维的有效演绎指南:
Array e = {{1, 2}, {3, 4}}; // Expects T = int Array f = {{1.0, 2.0}, {3.0, 4.0}}; // Expects T = double有没有办法为这个类写类型推导指南?
【问题讨论】:
-
@user4581301 我已经看到了这个问题,但我认为这对我目前的情况没有帮助。在那个问题中,矩阵始终是二维的,但我的数组并非如此,我不能尽可能多地编写嵌套的 std::initializer_list ......另外,这个问题对我的第二个问题也没有帮助.
标签: c++ arrays multidimensional-array initializer-list