Есть ли способ написать вариант std::tie
в C ++ 11 / 1y, который тесно связан с кортежем. То есть тот, в котором tie((x,y),z) = make_tuple(make_tuple(1,2),3)
связывает x, y, z
в 1, 2 and 3
соответственно как в следующем примере. Это было бы хорошо. Благодарю.
#include <tuple>
#include <iostream>
using namespace std;
int main() {
int x, y ,z;
auto t = make_tuple(1,2);
std::tie(y,x)= t;
//std::tie((x,y),z) = make_tuple(t,3); //not working
cout << x << y << z << endl;
return 0;
}
Может быть, вы ищете std::tuple_cat
:
std::tie(x,y,z) = std::tuple_cat(t, make_tuple(3));
Вы можете связать вместе tuples
как один длинный кортеж, чтобы не иметь дело с вложенными кортежами. Я думаю, что решение для выравнивания вложенных кортежей было бы более сложным.
Просто чтобы прояснить, как std::tie
работает (думаю). std::tie
строит кортеж ссылок lvalue из своих аргументов. Когда вы используете оператор присваивания, копирование заданий выполняется. std::tie((x,y),z)
не делает то, что ты думаешь. Вы подчиняете (x,y)
на оператор запятой, где х отбрасывается. Не происходит никакого волшебства, где вложение определяется скобками. Если один из аргументов std::tie
является кортежем, то соответствующий аргумент также должен быть кортежем. т.е .: std::tie(tuple, 3) = std::make_tuple(std::make_tuple(1, 2), 3)
, Однако это не то, что вы хотите, и именно отсюда и моё предположение, потому что не похоже, что вы намерены сгладить вложенный кортеж.
Вы можете пойти:
std::forward_as_tuple(std::tie(x, y), z) = std::make_tuple(t, 3);
std::forward_as_tuple
работает очень похоже на std::tie
, кроме того, что в отличие от этого он не будет отклонять std::tie(x, y)
в качестве аргумента.