std::tie
предоставляет удобный способ распаковать содержимое кортежа в C ++ в отдельно определенные переменные, как показано в примере ниже
int a, b, c, d, e, f;
auto tup1 = std::make_tuple(1, 2, 3);
std::tie(a, b, c) = tup1;
Тем не менее, если у нас есть вложенный кортеж, как показано ниже
auto tup2 = std::make_tuple(1, 2, 3, std::make_tuple(4, 5, 6));
пытаясь скомпилировать код
std::tie(a, b, c, std::tie(d, e, f)) = tup2;
не удается с ошибкой
/tmp/tuple.cpp:10: error: invalid initialization of non-const reference of type ‘std::tuple<int&, int&, int&>&’ from an rvalue of type ‘std::tuple<int&, int&, int&>’
std::tie(a, b, c, std::tie(d, e, f)) = tup2;
^
Есть ли идиоматический способ распаковать кортеж кортежей в C ++?
Когда вы знаете, что риска нет, вы можете преобразовать ссылку rvalue в ссылку lvalue с помощью следующей вспомогательной функции:
template <class T>
constexpr T &lvalue(T &&v) {
return v;
}
Вы можете использовать его таким образом:
std::tie(a, b, c, lvalue(std::tie(d, e, f))) = tup2;
В вашем случае действительно нет проблем с этим, поскольку внутренний кортеж должен быть живым только на время выполнения оператора, и это (именно так).
Других решений пока нет …