use*_*460 0 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
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?我试过使用嵌套的std :: arrays无济于事(大概是因为它们的行为与c风格的数组相同).是否有可能通过初始化列表实现这一目标?(我尝试过使用init-lists,但我不确定它们是否不合适,或者它们是不是按照我的预期行事.)
我正在使用gcc和c ++ 14.
添加一个构造函数,如:
Matrix(std::array<std::array<T, M>, N> const& initMat) { ... }
Run Code Online (Sandbox Code Playgroud)
并添加另一组花括号(std::array对象):
Matrix<double, 2, 2> matB({{{1.0,2.0},{3.0,4.0}}});
Run Code Online (Sandbox Code Playgroud)
或使用std::initialize_list如下:
Matrix(std::initializer_list<std::initializer_list<T>>){}
Run Code Online (Sandbox Code Playgroud)
然后你可以从上面的定义中删除括号(和一对花括号):
Matrix<double, 2, 2> matB{{1.0,2.0},{3.0,4.0}};
Run Code Online (Sandbox Code Playgroud)
这样做的缺点是不会强制执行初始化程序列表的大小.因此我建议使用第一个变体std::array.
| 归档时间: |
|
| 查看次数: |
403 次 |
| 最近记录: |