参考
https://msdn.microsoft.com/zh-cn/magazine/cc163362.aspx
Cocos2d-x的源码里有很多
auto item2 = MenuItemFont::create("— Go Back —", [&](Ref *sender) { static_cast<LayerMultiplex*>(_parent)->switchTo(0);});
auto item3 = MenuItemSprite::create(spriteNormal, spriteSelected, spriteDisabled, [](Ref *sender) {log("sprite clicked!");});
这种类型的代码。
从create函数的函数声明里,我们可以看到【】和【&】这些代码所在的地方是回调函数所在的地方。
其实这是C++11新引入的一种语法,叫做Lambda表达式。
而在C++98中,我们的回调函数是要这么设置的,
boolcompare(int&a,int&b)//先定义比较函数
{
returna>b;//降序排序
}
sort(a,a+n,compare);//再调用
现在又了新增的Lambda语法标准:
我们可以
sort(a, a+n, [](int a, int b){return a > b;});
是不是简洁很多,看了Lambda的好处。下面详细了解下Lambda
C++中,一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。它与普通函数不同的是,lambda必须使用尾置返回来指定返回类型。
由于Lambda的类型是唯一的,不能通过类型名来显式声明对应的对象,但可以利用auto关键字和类型推导:
auto f=[](inta,intb){returna>b;});
我们注意到 Lambda表达式的前面有个[]里面有时有&有时没有,是怎么回事?
[x,// x以傳值方式傳入(預設),y以傳參考方式傳入。
, x, &z] // z顯示地以參考方式加以引用。其餘變數以傳值方式加以引用。我们注意到 有&的表达式里都引用了外部变量,相反没有引用外部变量的就没有&。
在新的C++14标准中,还支持基于类型推断的泛型表达式.
sort(a,a+n,[](const auto&a,const auto&b){return a>b;});//降序排序:不依赖a和b的具体类型
好处是:
,使用双手的是劳工,使用双手和头脑的舵手,