3

有没有办法std::tie在 c++11/1y 中编写一个与元组密切相关的变体。也就是说,其中一个 tie((x,y),z) = make_tuple(make_tuple(1,2),3)绑定x, y, z1, 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;
}
4

2 回答 2

5

你可以走了:

std::forward_as_tuple(std::tie(x, y), z) = std::make_tuple(t, 3);

std::forward_as_tuple与的工作方式非常相似std::tie,不同之处在于它不会拒绝std::tie(x, y)作为参数。

于 2014-01-23T11:36:32.543 回答
5

也许您正在寻找std::tuple_cat

std::tie(x,y,z) = std::tuple_cat(t, make_tuple(3)); 

您可以作为一个长元组串在一起tuples,以避免处理嵌套元组。我认为扁平化嵌套元组的解决方案会更复杂。


只是为了澄清如何std::tie工作(我认为)。std::tie从它的参数构造一个左值引用的元组。使用赋值运算符时,会执行复制赋值std::tie((x,y),z)不按你的想法做。您要(x,y)使用逗号运算符,其中 x 被丢弃。没有魔法发生,嵌套是由括号决定的。如果其中一个参数std::tie是一个元组,那么相应的参数也应该是一个元组。即:std::tie(tuple, 3) = std::make_tuple(std::make_tuple(1, 2), 3)。但是,这不是您想要的,这就是我的建议的来源,因为您的意图似乎不是要展平嵌套的元组。

于 2014-01-23T04:01:58.303 回答