用过gcc的进来下,本人用vc2013,关于lambda的问题求确认
c++吧
全部回复
仅看楼主
level 1
士止刀口 楼主
以下是一个非类成员函数指针(即一般的函数) 或者静态类成员指针
typedef void (*void_fp_void)();//定义了这么一个类型
void_fp_void func1 = [](){ /*..........*/ };//这种情况下没有用到函数外的变量可以成功
int i = 0;
void_fp_void func2 = [&](){ ++i; };//问题出现了,不能赋值,因为类型不同
/////////////然后我又做了下面的测试///////////////////////
int i1 = 0;
int i2 = 0;
auto func1 = [=]{ ++i1; }//只拷贝了i1 一个int
auto func2 = [=]{ ++i1; ++i2; }//拷贝了i1和i2 两个int
cout << sizeof(func1);//输出 4 即一个int 的大小
cout << sizeof(func2);//输出 8 即2个 int 的大小
这么看来我不免会想,所谓的闭包只不过是一个
重载 了 operator() 函数操作符的类型,一个语法糖而已,
我没用过gcc 不知道这只是 vc2013这么搞还是lambda就是个语法糖
我本来是想用 lambda来解决 WNDPROC不能是 非静态类成员函数的问题,
结果碰壁了,如果 lambda 只是这样 那么这个功能基本上可以用重载operator()来模拟
运行时也没有生成新的函数。只不过是生成了一个 重载了operator()的类对象,
该对象保存了相关的函数外变量的指针或者直接拷贝。
/////////////////////////////////////////////////////////////////////////////////
如果用gcc的请试以下,我没有找到相关lambda的实现的资料
还是我哪里使用错了
可以将 用了 函数外 变量的 lambda 赋值给
非类成员函数(即一般的函数) 或 静态类成员函数
还是 vc2013偷懒 写了个 模板 充当 lambda , gcc 可以,
如果lambda只是语法糖,那么
如何为 每一个窗口 提供一个拥有自己独立地址的 WNDPROC 的函数。
2013年12月09日 04点12分 1
level 9
[冷]楼主为何如此机制
没错,他就是语法糖
2013年12月09日 04点12分 2
你用 gcc 试了?
2013年12月09日 04点12分
回复 士止刀口 :[冷]我还没学C++的时候,就已经知道lambda了
2013年12月09日 04点12分
回复 士止刀口 :typedef std::function<void()> fp_void;我们需要的只是函数签名哦
2013年12月09日 04点12分
但是从二进制上来说,一个类对象无法 赋值到 一个 函数指针上,这样的lambda 无法越过 以前 c语言 靠 传递函数指针 导致与类的结合很差例如 windows api 用到的 WNDPROC ,这些都是c语言用的的,这样兼容很差必须为特定的窗口都写一个 wndproc(没效率),不然就是在 单个WNDPROC中使用 映射(没性能)
2013年12月09日 05点12分
level 1
ideone.com
2013年12月09日 04点12分 3
level 3
GCC是什么?[泪]
2013年12月09日 05点12分 4
GNU Compiler Collection,GNU编译器集合
2013年12月09日 06点12分
level 12
听说有个很NX的函数SetWindowLong,不知道跟LZ的需求相符不
2013年12月09日 06点12分 5
这个我用过,不过最先能用SetWindowLong的时候是WM_NCCREATE这个消息连同CREATESTRUCT的时候才能把 自己的 数据与窗口想关联,之前会有几个消息被漏掉。
2013年12月09日 06点12分
level 1
士止刀口 楼主
[不高兴]自己顶起,
如果 lambda 不行的话
关于闭包 C++还有没有其他的支持
就像很多人比喻的那样,
运行的时候生成 一个 函数;
而不是像这个vc2013那样的实现,
生成了一个对象,该对象封装了自由变量
(这样的行为和类还真没什么区别)
毕竟
MyClass mc;
WNDCLASSEX wcex;
wcex.lpfnWndProc = [&](HWND,UINT,WPARAM,LPARAM)->LRESULT{
mc.MyClassFunc();
};
//windows api 不认账,因为二进制上 该lambda是个对象,不是函数指针。
其实我只是要 让 windows api里的WNDPROC回调函数
2013年12月09日 06点12分 6
1