【发布时间】:2018-01-10 20:36:50
【问题描述】:
C++17 标准引入了一个新的structured bindings 功能,最初是 2015 年的proposed,后来它的语法出现了广泛的discussed。
当您查看文档时,就会想到它们的一些用途。
聚合分解
让我们声明一个元组:
std::tuple<int, std::string> t(42, "foo");
使用结构化绑定可以很容易地在一行中获得命名的元素副本:
auto [i, s] = t;
相当于:
auto i = std::get<0>(t);
auto s = std::get<1>(t);
或
int i;
std::string s;
std::tie(i, s) = t;
对元组元素的引用也可以轻松获得:
auto& [ir, sr] = t;
const auto& [icr, scr] = t;
所以我们可以使用所有成员都是公共的数组或结构/类。
多个返回值
一种从函数中获取多个返回值的便捷方法紧随上述内容。
还有什么?
您能否提供一些其他可能不太明显的结构化绑定用例?它们还能如何提高 C++ 代码的可读性甚至性能?
备注
正如在 cmets 中提到的,结构化绑定的当前实现缺少一些特性。它们是非可变的,它们的语法不允许显式跳过聚合成员。 Here 可以找到关于可变性的讨论。
【问题讨论】:
-
已经阅读了答案......基本上没有。这只是语法糖。由于您不能使它们成为可变参数,因此围绕可变参数模板扩展也没有什么有趣或令人印象深刻的事情。
-
我看到的结构化绑定的唯一问题是不能“忽略”聚合的任何成员。如果将此与 Python 的可迭代解包进行对比,它似乎没那么有用。
-
@Sergey 这只不过是一种在一组变量中解压缩结构的方法。实际上并没有那么有趣或令人印象深刻。
-
您只想列出语言功能的用途?这就是“太宽泛”的缩影。
-
同意这个问题可以更具体,但如果措辞更简洁,可能不会太宽泛。我要指出,从前人们也没有过多考虑设计模式。规范中是否有某些内容表明需要添加结构化绑定?
标签: c++ c++17 structured-bindings