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

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

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

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

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

现在,我怎样才能继续只存储b和c并丢弃一个?

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

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);

还有另一个更直接的方法来解包元组中的一些参数吗?

解决方法:

另一种方法是使用std :: tie:

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

编辑

正如评论中所提到的,这种方法存在一些问题:

>无法进行类型推断
>之前必须构造对象,因此除非默认构造函数是微不足道的,否则它不是一个好的选择.

上一篇:元组对,使用python找到最小值


下一篇:如何在C 11(STL)中创建一个拉链两个元组的函数?