用数组(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);
但它不安全(第一个元组元素将指向堆栈内存);请参阅下面的讨论。
我想要一个以数组元素作为成员的元组。特别是,我希望这个数组元素是二维的——所以任何答案都必须适用于一维以上的元素。我最理想的是可以用初始化列表初始化的东西,例如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);
但它不安全(第一个元组元素将指向堆栈内存);请参阅下面的讨论。