我们假设您需要调用以下方法:
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();
编辑
正如评论中所提到的,这种方法存在一些问题:
>无法进行类型推断
>之前必须构造对象,因此除非默认构造函数是微不足道的,否则它不是一个好的选择.