c ++ 11 — распаковка вложенных кортежей в переполнении стека

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 ++?

7

Решение

Когда вы знаете, что риска нет, вы можете преобразовать ссылку rvalue в ссылку lvalue с помощью следующей вспомогательной функции:

template <class T>
constexpr T &lvalue(T &&v) {
return v;
}

Вы можете использовать его таким образом:

std::tie(a, b, c, lvalue(std::tie(d, e, f))) = tup2;

В вашем случае действительно нет проблем с этим, поскольку внутренний кортеж должен быть живым только на время выполнения оператора, и это (именно так).

4

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

Других решений пока нет …

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