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

mda*_*sev 2 c++ stl initializer-list c++11 stdarray

我正在用C++实现一个Matrix类,我希望能够用一个初始化列表来初始化它,如下所示:

Matrix<double, 2, 3> m({{1,2,1}, 
                        {0,1,1}});
Run Code Online (Sandbox Code Playgroud)

在类中我实现了这样的构造函数:

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++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码工作,但我有几个问题.是否可以使它安全,所以它只需要一定大小的初始化列表(矩阵的大小),其次我可以使代码更简洁 - 我曾想象过这样的事情:

Matrix(const std::initializer_list<std::initializer_list<Ty>>& list)
    : data(list)
{ }
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*rry 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)
    { }
};
Run Code Online (Sandbox Code Playgroud)

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

没有办法静态强制执行a的大小std::initializer_list- 你必须assert或者throw阻止我传递一堆额外的值并导致你执行超出范围的写入.