加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在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) {...});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读