如何通过自定义结构传递数组初始化?

Aer*_*Sun 4 c++ c++17 c++20

通常数组可以这样初始化:

int ooo[3][3] =
{
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};
Run Code Online (Sandbox Code Playgroud)

我需要像这样将它隐藏到自定义结构中:

template <typename T, size_t dim1, size_t dim2>
struct MyStruct
{
private:
    T m_data[dim1][dim2];
};
Run Code Online (Sandbox Code Playgroud)

如何像傻瓜一样将初始化传递给数组?

MyStruct<int, 3, 3> s = 
{
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 5

如果您可以公开成员并添加一组大括号,它将起作用。这是聚合初始化:

MyStruct<int, 3, 3> s = 
{{
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 },
}};
Run Code Online (Sandbox Code Playgroud)

我需要将它隐藏到自定义结构中...

如果您需要成员是私有的,则不能依赖聚合初始化,因为该类不会是聚合。如果您定义自定义构造函数,您仍然可以实现类似的语法。这是一个使用std::initializer_list. 这个不需要额外的括号。

编辑:这不如另一个答案中的数组参考示例。

MyStruct(std::initializer_list<std::initializer_list<T>> ll)
{
    auto row_in = ll.begin();
    for (auto& row : m_data)
    {
        auto col_in = (row_in++)->begin();
        for (auto& i : row)
        {
            i = *col_in++;
        }
     }
}
Run Code Online (Sandbox Code Playgroud)


cig*_*ien 5

您可以向类添加一个构造函数,该构造函数接受一个 2D 数组参数,并将其复制到数组成员中:

template <typename T, size_t dim1, size_t dim2>
struct MyStruct
{
private:
    T m_data[dim1][dim2];
public:
    MyStruct(T const (&a)[dim1][dim2]) {
        for (int i = 0; i < dim1; ++i)
            for (int j = 0; j < dim2; ++j)
                m_data[i][j] = a[i][j];
    }
};
Run Code Online (Sandbox Code Playgroud)

您还需要在调用站点添加一对额外的大括号。

这是一个演示