我正在用C ++实现一个Matrix类,我希望能够用这样的初始化列表初始化它:
Matrix<double, 2, 3> m({{1,2,1},
{0,1,1}});
在类中我实现了这样的构造函数:
template<typename Ty, unsigned int rows, unsigned int cols>
class Matrix
{
std::array<std::array<Ty, cols>, rows> data;
public:
Matrix(const std::initializer_list<std::initializer_list<Ty>>& list)
{
int i = 0;
for (auto& list_row : list)
{
int j = 0;
for (auto& list_value : list_row)
{
data[i][j++] = list_value;
}
i++;
}
}
}
代码工作但我有几个问题。是否可以使它安全,所以它只需要一定大小的初始化列表(矩阵的大小),其次我可以使代码更简洁 - 我曾想象过这样的事情:
Matrix(const std::initializer_list<std::initializer_list<Ty>>& list)
: data(list)
{ }
它并不起作用,但任何更好的方法都会受到赞赏。
答案 0 :(得分:5)
有一种非常简单的方法可以确保安全:
template<typename Ty, unsigned int rows, unsigned int cols>
class Matrix
{
std::array<std::array<Ty, cols>, rows> data;
public:
Matrix(std::array<std::array<Ty, cols>, rows> const& in)
: data(in)
{ }
};
这使您几乎使用您想要的语法 - 您只需要一组额外的{}
s。
无法静态强制执行std::initializer_list
的大小 - 您必须assert
或throw
以防止我传递一堆额外的值并导致您执行超出范围的写入。