C 17:元组解包时只保留一些成员

新手上路,请多包涵

假设您需要调用以下方法:

 std::tuple<int, int, int> foo();

在 C++17 中,您可以在一行中调用该函数并将元组解包:

 auto [a, b, c] = foo();

现在,我怎样才能继续只存储 bc 并丢弃 a

目前,我只知道两个选项:


1 - 我可以在自动解包时使用虚拟变量

但是,虚拟变量将未被使用,它会发出警告,所以如果我想忽略该警告,代码将非常难看:

 #pragma warning(push)
#pragma warning(disable:4101)
// ReSharper disable once CppDeclaratorNeverUsed
auto [_, b, c] = foo();
#pragma warning(pop)


2 - 我可以存储整个元组并使用 std::get 来检索对我需要的唯一变量的引用。代码不那么令人不快,但语法也不那么简单。

此外,对于我们希望保留在元组中的每个新值,此代码的大小都会增加一行。

 auto tuple = foo();
int b = std::get<1>(tuple);
int c = std::get<2>(tuple);


是否有另一种更直接的方法可以仅解压缩元组中的某些参数?

原文由 Antoine C. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 417
1 个回答

另一种选择是使用 std::tie

 int b, c;
std::tie(std::ignore, b, c) = foo();

编辑

如评论中所述,这种方法存在一些问题:

  • 不可能进行类型推断
  • 对象必须在之前构造,所以除非默认构造函数是微不足道的,否则它不是一个好的选择。

原文由 Mansuro 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题