Возможна ли распаковка пары и кортежа в уже созданные переменные

Рейтинг: 1Ответов: 1Опубликовано: 05.04.2023

Есть функция, которая возвращает пару или кортеж. Результат её вызова нужно сохранить в уже созданные ранее переменные. Можно ли это сделать не создавая промежуточных объектов?

// Функция возвращает пару. 
std::pair<int, int> Foo() { return { 1, 2 }; }

...

// Распаковка пары в новые переменные.
auto [one, two] = Foo();
member_one_ = one; // Затем записываем результат в уже существующие переменные. 
member_two_ = two;

В этом примере приходится создавать ненужные переменные one и two, которые по сути не нужны. Вместо этого хотелось бы видеть что-то подобное.

// Записываем возвращаемые значения сразу в необходимые переменные. 
[ member_one, member_two ] = Foo();

Ответы

▲ 8Принят

Structured binding не может распаковывать в существующие переменные.

Кроме того, обратите внимание, что он создает не несколько отдельных переменных, а одну - безымянную (имена в квадратных скобках ссылаются на ее поля). Хотя в вашем случае это ничего не меняет.


Решение такое: std::tie(member_one, member_two) = Foo();. Работает даже в С++11.