通常数组可以这样初始化:
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)
如果您可以公开成员并添加一组大括号,它将起作用。这是聚合初始化:
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)
您可以向类添加一个构造函数,该构造函数接受一个 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)
您还需要在调用站点添加一对额外的大括号。
这是一个演示。