KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I've been playing around a lot with the new C++11 lambda's, and the requirement to fully specify the template argument is a real drag. The syntax I would like to be using is something similar to the following: #include <vector> #include <algorithm> struct foo { void bar() {} }; int main() { vector<foo> v(10); for_each(v.begin(), v.end(), [](f) {f.bar();}); ^^^ } Is there any way to get anything approximately close to this? Boost's Phoenix library is OK, but the syntax for calling member functions requires lots of boiler plate - I guess I'm after C++11's ease of calling member functions coupled with Phoenix's automatic deduction of type. Current idea I have gotten it down to this syntax: 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();}); Which works, but you have to add the capability per type (eg. ADD_AUTO_LAMBDA_SUPPORT(foo); ). It also has the limitation that all supported types can not have any ambiguous members. The full code for that is: #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(), x.end(), [](_a f) {f->f();});
Tags (comma-separated)
Save Edits
Cancel