我们可以用c ++ 1y std :: tie()函数做深层次的联系吗?

时间:2014-01-23 03:24:19

标签: c++ c++11 c++14 tie

有没有办法在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;
}

2 个答案:

答案 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_tuplestd::tie的工作方式非常相似,不同之处在于它不会拒绝std::tie(x, y)作为参数。