可以在多态lambda中使用结构化绑定语法

时间:2017-08-07 07:18:37

标签: c++ lambda c++17

结构化绑定使得它更加干净和可读,可以迭代一个基于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;请求实例化时(即调用函数时)可能会发生进程

2 个答案:

答案 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))