我一直在使用新的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) {...});