c++ - 通过构造函数在类中初始化二维数组

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

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

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 样式数组相同)。是否可以通过初始化列表来实现这一点? (我试过使用 init-lists 但我不确定它们是否不合适或者它们的行为不符合我的预期。)

我正在使用 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>>){}

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

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

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

关于c++ - 通过构造函数在类中初始化二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44261183/

相关文章:

C# 复制构造函数

javascript - meteor.js - 将数组推送到用户集合

javascript - 你能帮我理解 sort() 在 Javascript 中是如何工作的吗?

typescript - Typescript 构造函数中的公共(public)与私有(private)

C++:使用 Eigen 时将函数传递给构造函数

c++ - 比较C中的两个int数组

c++ - STL list<Object> 迭代器用于更改列表中的对象

c++ - 显式移动构造函数?

c++ - GNU gcc 和 g++

c++ - 在 MPI、C++ 中发送动态数组