使用作为参数传递的 std::intializer_list 初始化 std::数组

Initializing an std::array with an std::intializer_list passed as a parameter

本文关键字:std list 初始化 数组 intializer 参数传递      更新时间:2023-10-16

我正在C++中实现一个矩阵类,我希望能够使用初始化器列表对其进行初始化,如下所示:

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

它不起作用,但任何更好的方法将不胜感激。

有一种非常简单的方法可以使其安全:

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

这让你几乎可以使用你想要的语法 - 你只需要一组额外的{}

没有办法静态强制执行std::initializer_list的大小 - 您必须assertthrow以防止我传入一堆额外的值并导致您执行超出范围的写入。