哪位了解这个写法:return [ptr,callback](EventType& e)

dyw 2011-10-11 05:25:33
没见过这两个写法,请教一下:
1)return [=] { ... }
2) return [ptr,callback](EventType& e) { ... }

详细:

template<typename EventType, typename F>
std::function<void(EventType&)> wrapper(F callback)
{
return [=](EventType& e) { // 1)
if (!e.canceled)
callback(e);
};
}

template<typename EventType, typename F, typename WorldType>
std::function<void(EventType&)> world_wrapper(F callback,
std::shared_ptr<WorldType> world)
{
std::weak_ptr<WorldType> ptr(world);

return [ptr,callback](EventType& e) // 2)
{
std::shared_ptr<WorldType> world = ptr.lock();
if (world && e.world == world)
callback(e);
};
}
...全文
346 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dandycheung 2011-11-19
  • 打赏
  • 举报
回复
C++ 搞得越来越没劲了。这种语法,只能让更多的人对学习它望而却步,虽然我一贯不太喜欢 Java,但按这个趋势走下去,我也只能越来越讨厌 C++。
dyw 2011-10-13
  • 打赏
  • 举报
回复
解答一下:
1)return [=] { ... }
[=] 表示自动按值收集lambda体外部的变量
2) return [ptr,callback](EventType& e) { ... }
[ptr,callback] 表示按值传递这两个变量到lambda体中。

此外还有[&], 就是按引用了。更多可参考上面MSDN blog的那篇文章,讲解、例子很详细。
MagiSu 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qq120848369 的回复:]

弄的和java似的。
[/Quote]

别用这个恶心我。
qq120848369 2011-10-11
  • 打赏
  • 举报
回复
弄的和java似的。
dyw 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chiyer 的回复:]

c++0x的 laumbda

http://www.kuqin.com/language/20090615/56815.html
[/Quote]

感谢!搜索VS2010对c++0x的支持时,刚好看到了此文的英文版:
http://blogs.msdn.com/b/vcblog/archive/2008/10/28/lambdas-auto-and-static-assert-c-0x-features-in-vc10-part-1.aspx

C++0x Core Language Features In VC10: The Table
http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language-features-in-vc10-the-table.aspx
星羽 2011-10-11
  • 打赏
  • 举报
回复
东莞某某某 2011-10-11
  • 打赏
  • 举报
回复
哎 跟不上时代的步伐了
dyw 2011-10-11
  • 打赏
  • 举报
回复
补充:需要添加编译器选项:-std=c++0x 或 -std=gnu++0x

Qt项目可使用:QMAKE_CXXFLAGS += -std=c++0x
dyw 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 taodm 的回复:]

c++2011标准lambda表达式。
其它google吧,可以结贴了。
[/Quote]

正确,是c++0x的新特性:lambda表达式。曾猜测是boost::lambda,仔细看了又不像。

GCC4.5引入这个特性。有兴趣的朋友可以编译测试下面这段代码:

#include <algorithm>
#include <cmath>
void abssort(float *x, unsigned N) {
std::sort(x, x+N,
[](float a, float b) { // 注意此处的方括弧
return std::abs(a) < std::abs(b);
});
}

参考:
1)http://gcc.gnu.org/gcc-4.5/cxx0x_status.html
2)http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2009/n2927.pdf
3)http://www.ibm.com/developerworks/cn/aix/library/au-gcc/
taodm 2011-10-11
  • 打赏
  • 举报
回复
c++2011标准lambda表达式。
其它google吧,可以结贴了。
iamnobody 2011-10-11
  • 打赏
  • 举报
回复
接分,应该是楼上所说的吧。
我只见过:
int i = 0;
std::for_each(vec.begin(),vec.end(),[&i](T& x){ i += x;});

应该是类似的东西,都是个函数对象。
飞天御剑流 2011-10-11
  • 打赏
  • 举报
回复
编译器扩展。
luciferisnotsatan 2011-10-11
  • 打赏
  • 举报
回复
啥东西的特殊扩展???
不清楚

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧