在C ++中解压缩嵌套元组

时间:2015-11-08 18:30:26

标签: c++ c++11 tuples tie

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 ++中的元组元组?

1 个答案:

答案 0 :(得分:4)

当您知道没有风险时,您可以通过以下帮助函数将右值引用转换为左值:

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

然后你可以这样使用它:

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

在你的情况下,确实没有问题,因为内部元组只需要在语句的持续时间内保持活动状态,并且(确切地)就是这种情况。