【问题标题】:Unpacking nested tuples in C++在 C++ 中解包嵌套元组
【发布时间】:2015-11-08 18:30:26
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

你可以这样使用它:

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

在您的情况下,这样做确实没有问题,因为内部元组只需要在语句期间保持活动状态,并且(完全)是这种情况。

【讨论】:

  • 是否可以定义复合函数ltie,其中调用ltie(a, b, c)相当于调用lvalue(std::tie(a, b, c)),以便将代码简化为ltie(a, b, c, ltie(d, e, f)) = tup2
  • 不幸的是它不是。如果您将临时元组埋入一个函数中,那么它将是该函数的本地元组,并且不会存在足够长的时间。你可以把它变成一个宏。
  • 或者直接使用forward_as_tuple
猜你喜欢
  • 2013-08-07
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多