结构化绑定使得它更加干净和可读,可以迭代一个基于for循环的范围的地图,如下所示
for (auto [key, value] : map) {
cout << key << " : " << value << endl;
}
但是可以在lambda表达式中使用结构化绑定,如下所示吗?
std::for_each(map.begin(), map.end(), [](auto [key, value]) {
cout << key << " : " << value << endl;
});
从上面看来,上面的代码不适用于我在这里找到的在线C ++编译器https://wandbox.org/permlink/sS6r7JZTB3G3hr78。
如果它不起作用那么是否有充分的理由不支持上述内容?或者它只是尚未提出的东西?模板只会在使用时实例化,因此结构化绑定&#39; &#34;解绑定&#34;请求实例化时(即调用函数时)可能会发生进程
答案 0 :(得分:15)
语法目前不允许这样做;结构化绑定是simple-declaration:
简单声明:[...]
- attribute-specifier-seq opt decl-specifier-seq ref-qualifier opt[
标识符列表]
初始值设定项;
虽然函数参数是由parameter-declaration-list引入的,其中包含declarator s:
声明符指定这些实体的名称,并(可选)使用
*
(指向)和()
(函数返回)等运算符修改说明符的类型。
也就是说,结构化绑定是一种(块级)语句语法 - 您可以通过注意它的语法以分号;
结尾来看到这一点。允许在lambda参数列表中使用结构化绑定需要添加额外的语法。
这听起来是个好主意,我不能立即看到语法上的任何歧义;它肯定值得讨论,因为它比替代方案更好地,更简洁地解决了您提出的用例。
答案 1 :(得分:0)
我认为这是一个不错的建议(如果还没有的话),可以简化传递zip迭代器/引用元组的算法的代码。(例如https://github.com/correaa/iterator-zipper )
同时看来,通过提取函数第一行中的结构,使用更多冗长的代码并不是您无法实现的:
ID_string indexdate StudyIDBefore StudyDateBefore
0 55555555 2020-09-07 ['St33', 'St1', ...] [2020-09-06, 2019-06-22, ...]
1 66666666 2020-06-07 ['St11', 'St2', ...] [2020-05-22, 2020-05-01, ...]
https://wandbox.org/permlink/sS6r7JZTB3G3hr78
(加强了这一点的实现,并且易于添加到语言中)。
更精简的版本可以缩进为:
sorted=($(printf '%s\n' "${arr[@]}" | sort -nr))