gpt4 book ai didi

c++ - 在 C++11 中实现干净的 lambda 函数

转载 作者:可可西里 更新时间:2023-11-01 16:29:22 24 4
gpt4 key购买 nike

我一直在研究新的 C++11 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(), x.end(), [](_a f) {f->f();});
for_each(y.begin(), y.end(), [](_a b) {b->b();});
}

然后您可以使用一些模板和预处理器魔术来生成 _acombo,但是当您的名称不明确时(例如,第三个结构带有b() 函数 - 您需要一种方法来消除我目前无法想到的歧义。

最佳答案

注意:我完全同意 [](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++11 中实现干净的 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7843866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com