用数组(C 或 std::array)元素构造 C++ 元组的单行表达式是什么?

What is a one-line expression for constructing a C++ tuple with an array (C or std::array) element?

我想要一个以数组元素作为成员的元组。特别是,我希望这个数组元素是二维的——所以任何答案都必须适用于一维以上的元素。我最理想的是可以用初始化列表初始化的东西,例如std::tuple<ARRAY_TYPE, ...>({{0, 1}, {2, 3}}, ...).

看起来这样的元组很难构造,需要手动初始化(即for循环等)。这是我尝试过的:

std::tuple<int[M][N], ...> -- 由于 C 样式数组的限制,这不起作用。元组本身是一个有效类型,但需要手动进行初始化(而不是在构造时)。

std::tuple<std::array<std::array<int, M>, N>, ...>——我认为这会起作用,但由于某种原因,std::tuple<std::array<std::array<int, 2>, 2>, ...>({{0, 1}, {2, 3}}, ...) 之类的东西失败了 "no matching constructor error"。不过它确实适用于 1D。

std::tuple<std::vector<std::vector<int>>, ...>({{0, 1}, {2, 3}}, ...) 实际上 确实 有效,但向量在这里似乎有点矫枉过正

有什么想法吗?有什么方法可以让 C 风格的数组工作吗?那将是理想的。

数组周围需要一对额外的括号{}

std::tuple<std::array<std::array<int, 2>, 2>, int> v({{{0, 1}, {2, 3}}}, 1);
                                                     ^                ^

这是因为 std::array 是使用 聚合初始化 初始化的。它适用于 std::vector 因为有 std::vector<std::initializer_list<T> 构造函数(std::array 没有任何构造函数)。

您可以使用std::make_tuple,例如:

auto t = std::make_tuple<std::array<std::array<int, 2>, 2>>({{{1, 2}, {3, 4}}});

[编辑] 我最初的建议是:

auto t = std::make_tuple<int[2][2], int>({{1, 2}, {3, 4}}, 42);

但它不安全(第一个元组元素将指向堆栈内存);请参阅下面的讨论。