在C11中实现干净的lambda函数
发布时间:2020-12-16 03:24:40 所属栏目:百科 来源:网络整理
导读:我一直在使用新的C11 lambda来玩很多,并且完全指定模板参数的要求是一个真正的拖累.我想使用的语法类似于以下内容: #include vector#include algorithmstruct foo{ void bar() {}};int main(){ vectorfoo v(10); for_each(v.begin(),v.end(),[](f) {f.bar()
我一直在使用新的C11 lambda来玩很多,并且完全指定模板参数的要求是一个真正的拖累.我想使用的语法类似于以下内容:
#include <vector> #include <algorithm> struct foo { void bar() {} }; int main() { vector<foo> v(10); for_each(v.begin(),v.end(),[](f) {f.bar();}); ^^^ } 有什么办法可以接近任何事情吗? Boost的Phoenix库是可以的,但是调用成员函数的语法需要大量的锅炉板 – 我想我是在C 11之后轻松地调用成员函数以及Phoenix的自动扣除类型. 当前的想法 我已经得到这个语法: vector<foo> x(1); vector<bar> y(1); for_each(x.begin(),x.end(),[](_a f) {f->f();}); for_each(y.begin(),y.end(),[](_a b) {b->b();}); 哪个有效,但是您必须添加每种类型的功能(例如ADD_AUTO_LAMBDA_SUPPORT(foo);)).它还有一个限制,即所有支持的类型不能有任何不明确的成员. 完整的代码是: #include <vector> #include <algorithm> #include <iostream> using namespace std; struct foo { foo() : x(3) {} int x; void f() { cout << x << endl;} }; struct bar { bar() : y(133.7) {} double y; void b() { cout << y << endl;} }; struct combo : foo,bar { }; struct _a { _a(foo& f) : offset(reinterpret_cast<combo*>(&f)) {} _a(bar& b) : offset(reinterpret_cast<combo*>((char*)&b - 2*sizeof(foo))) {} combo* operator->() { return offset; } private: combo* offset; }; int main() { vector<foo> x(1); vector<bar> y(1); for_each(x.begin(),[](_a f) {f->f();}); for_each(y.begin(),[](_a b) {b->b();}); } 然后,您可以使用一些模板和预处理魔术来生成_a和combo,但是当您有不明确的名称(例如,具有ab()功能的第三个结构)时,会出现问题 – 您需要一种消除歧义的方式,我无法想象的时候. 解决方法
注意:我完全同意[](auto f){…}将是非常可取的!
虽然我们没有这个,好的老typedef呢?它只是添加一行,是非常“低科技”,使得lambda容易阅读: typedef const map<key_type,value_type>::value_type& λp_t; for_each(m.begin(),m.end(),[&](λp_t x) {...}); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |