Unpacking nested tuples in C++
std::tie
provides a convenient way to unpack the contents of a tuple in C++ into separately defined variables, like the sample below illustrates
int a, b, c, d, e, f;
auto tup1 = std::make_tuple(1, 2, 3);
std::tie(a, b, c) = tup1;
However, if we have a nested tuple like below
auto tup2 = std::make_tuple(1, 2, 3, std::make_tuple(4, 5, 6));
attempting to compile the code
std::tie(a, b, c, std::tie(d, e, f)) = tup2;
fails with an error
/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;
^
Is there an idiomatic way to unpack a tuple of tuples in C++?
When you know that there is no risk, you can convert an rvalue reference to an lvalue one through the following helper function :
template <class T>
constexpr T &lvalue(T &&v) {
return v;
}
You can then use it thusly :
std::tie(a, b, c, lvalue(std::tie(d, e, f))) = tup2;
In your case there is indeed no problem in doing that, since the inner tuple only has to be alive for the duration of the statement, and it is (exactly) the case.
链接地址: http://www.djcxy.com/p/88810.html上一篇: 使用gdb调试C ++ 11右值引用
下一篇: 用C ++解开嵌套元组