有没有办法在c ++ 11 / 1y中编写std::tie
的变体,它与元组深深地联系在一起。也就是说,其中tie((x,y),z) = make_tuple(make_tuple(1,2),3)
分别将x, y, z
绑定到1, 2 and 3
,如下例所示。这会很好。感谢。
#include <tuple>
#include <iostream>
using namespace std;
int main() {
int x, y ,z;
auto t = make_tuple(1,2);
std::tie(y,x)= t;
//std::tie((x,y),z) = make_tuple(t,3); //not working
cout << x << y << z << endl;
return 0;
}
答案 0 :(得分:5)
也许您正在寻找std::tuple_cat
:
std::tie(x,y,z) = std::tuple_cat(t, make_tuple(3));
您可以将tuples
串起来作为一个长元组,以避免处理嵌套元组。我认为扁平化嵌套元组的解决方案会更复杂。
只是为了澄清std::tie
的工作方式(我认为)。 std::tie
从其参数构造一个左值引用元组。使用赋值运算符copy assignments are performed时。 std::tie((x,y),z)
没有按你的想法行事。您将(x,y)
置于逗号运算符中,其中x被丢弃。没有魔法,嵌套由括号决定。如果std::tie
的一个参数是一个元组,那么相应的参数也应该是一个元组。即:std::tie(tuple, 3) = std::make_tuple(std::make_tuple(1, 2), 3)
。然而,这不是你想要的,这是我的建议来自的地方,因为你的意图似乎并不是要压扁一个嵌套的元组。
答案 1 :(得分:4)
你可以去:
std::forward_as_tuple(std::tie(x, y), z) = std::make_tuple(t, 3);
std::forward_as_tuple
与std::tie
的工作方式非常相似,不同之处在于它不会拒绝std::tie(x, y)
作为参数。