在C11中实现干净的lambda函数

前端之家收集整理的这篇文章主要介绍了在C11中实现干净的lambda函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在使用新的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) {...});

猜你在找的C&C++相关文章