мы можем сделать глубокую связь с c ++ 1y std :: tie () -подобной функцией?

Есть ли способ написать вариант 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;
}

3

Решение

Может быть, вы ищете 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), Однако это не то, что вы хотите, и именно отсюда и моё предположение, потому что не похоже, что вы намерены сгладить вложенный кортеж.

5

Другие решения

Вы можете пойти:

std::forward_as_tuple(std::tie(x, y), z) = std::make_tuple(t, 3);

std::forward_as_tuple работает очень похоже на std::tie, кроме того, что в отличие от этого он не будет отклонять std::tie(x, y) в качестве аргумента.

4

По вопросам рекламы [email protected]