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

时间:2017-05-30 11:35:43

标签: c++ arrays constructor initialization c++14

我有一个矩阵类,我希望能够用括号列表初始化二维数据数组的值。我发现通过在调用构造函数之前声明一个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 :: arrays无济于事(大概是因为它们的行为与c风格的数组相同)。是否有可能通过初始化列表实现这一目标? (我尝试过使用初始列表,但我不确定他们是否不合适,或者他们是不是按照我的预期行事。)

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

1 个答案:

答案 0 :(得分:5)

添加如下构造函数:

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>>){}

然后你可以从上面的定义中删除括号(和一对花括号):

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

这样做的缺点是初始化程序列表的大小不会被强制执行。因此,我推荐第一个变体,使用std::array