通过构造函数初始化类中的二维数组

问题描述:

我有一个矩阵类,我希望能够用括号列表初始化二维数据数组的值。我发现我可以通过在调用构造函数之前声明2D数组,然后将其作为构造函数参数传递来实现此目的。但是,我希望能够直接传递括号列表作为参数。通过构造函数初始化类中的二维数组

template <class T, unsigned int N, unsigned int M> 
class Matrix 
{ 
    T data[N][M]; 

    Matrix(const T initMat[N][M]) 
    { 
     for (unsigned int i=0; i<N; ++i) 
     { 
      for (unsigned int j=0; j<M; ++j) 
      { 
       data[i][j] = initMat[i][j]; 
      } 
     } 
    } 
}; 




const double arr[2][2] = {{1.0,2.0},{3.0,4.0}}; 
Matrix<double, 2, 2> matA(arr); // Valid 


Matrix<double, 2, 2> matB({{1.0,2.0},{3.0,4.0}}); // Invalid 

有没有办法来实现这一目标?我试图使用嵌套的std ::数组无效(大概是因为它们的行为与c样式数组相同)。通过初始化列表可以实现这一点吗? (我曾尝试使用初始化列表,但我不确定它们是否不合适,或者它们的行为不像我期望的那样)。

我正在使用gcc和C++ 14。

添加一个构造函数,如:

Matrix(std::array<std::array<T, M>, N> const& initMat) { ... } 

并添加另一组花括号中(对于std::array对象):

Matrix<double, 2, 2> matB({{{1.0,2.0},{3.0,4.0}}}); 

或者使用std::initialize_list,如:

Matrix(std::initializer_list<std::initializer_list<T>>){} 

然后y OU可以从上述定义丢弃圆括号(和一对大括号的):

Matrix<double, 2, 2> matB{{1.0,2.0},{3.0,4.0}}; 

与此缺点是初始化列表的尺寸将不被执行。因此我推荐使用std::array的第一个变体。

+2

你能解释为什么我们必须使用这些额外的花括号吗? –

+1

@AndreasH。他们是为'std :: array'对象本身。 –

+0

* std :: array *的非常整洁的用法! –