Есть ли хороший способ использовать std::tie
и создать новую переменную за один раз? Другими словами, если функция возвращает std::tuple
, и мы хотим в конечном счете разбить результат на отдельные компоненты, есть ли способ выполнить эти назначения без предварительного определения переменных?
Например, рассмотрим следующий код:
#include <tuple>
struct Foo {
Foo(int) {}
};
struct Bar{};
std::tuple <Foo,Bar> example() {
return std::make_tuple(Foo(1),Bar());
}
int main() {
auto bar = Bar {};
// Without std::tie
{
auto foo_bar = example();
auto foo = std::get<0>(std::move(foo_bar));
bar = std::get<1>(std::move(foo_bar));
}
// With std::tie
#if 0
{
// Error: no default constructor
Foo foo;
std::tie(foo,bar) = example();
}
#endif
}
В принципе, функция example
возвращает кортеж. У нас уже есть переменная типа Bar
, которую мы хотим назначить, но нам нужна новая переменная типа Foo
. Без std::tie
нам не нужно создавать фиктивный экземпляр Foo
, но для этого кода нам нужно сначала поместить все в std::tuple
, а затем разделить его. С std::tie
мы должны сначала выделить фиктивный Foo
, но для этого у нас нет конструктора по умолчанию. Действительно, мы притворяемся, что конструкторы для Foo
сложны, поэтому сначала создать фиктивное значение нежелательно. В конечном итоге мы хотели бы назначить как в Foo
, так и Bar
, но хотим выполнить это назначение и выделить память для Foo
в то же время.