因为了开始找工作了,原来的cocos2dx 2.x因为没有涉及到C++11,不免要熟悉下C++11.
一、lambda表达式
这个算是最明显的特征了,在写cocos2dx的时候就经常碰到只是为了调用一行代码而不得不去写一个函数,甚至一个类。
先看一个最简单的Lambda表达式
void LambdaTest::test1()
{
auto fun = [](){std::cout<<"this is a basic lambda test"<<std::endl;};//定义一个最简单的Lambda表达式
fun();
}
Lambda表达式的形式为[capture](parameters)mutable/exception->return value{body}最简形式如上例中的[](){};
capture的值可以是=(以值传递)&(引用传递)当前作用块中的值;以值传递时只有加上Mutable修饰之后才能在表达式中修改改值
如
则会报错。
capture还可以值为(a,&b),(a)(this)(=,&a)分别为a传值b引用,a传值,引用this中变量,除a引用其它都传值。
//
// LambdaTest.cpp
// cpp0x
//
// Created by Enh. on 7/8/14.
// Copyright (c) 2014 enh. All rights reserved.
//
#include "LambdaTest.h"
#include <iostream>
#include <vector>
#include <algorithm>
LambdaTest::LambdaTest()
: m_memberVaule(0)
{
}
void LambdaTest::test1()
{
std::function<void()> fun = [](){std::cout<<"this is a basic lambda test"<<std::endl;};//定义一个最简单的Lambda表达式
fun();
}
void LambdaTest::test2()
{
int i = 0;
auto fun0 = [=](){printf("read value i = %d\n",i);};
fun0();
auto fun1 = [i]()mutable{i++;std::cout<<"value i = "<<i<<" in lambda"<<std::endl;};
fun1();
std::cout<<"value i = "<<i<<" out lambda"<<std::endl;
auto fun2 = [&](){i++;printf("value i = %d by use &\n",i);};
fun2();
auto fun3 = [this](){m_memberVaule++;printf("member value m_member = %d\n",this->m_memberVaule);};
fun3();
}
typedef int (*CALL_BACK_FUN)();
typedef void(*CALL_BACK_FUN0)();
void LambdaTest::test3()
{
CALL_BACK_FUN fun = []()->int{printf("test 3\n");return 0;};
std::function<int()> fun1 = fun;
fun();
fun1();
}
void LambdaTest::test4()
{
std::vector<int> testVector = {1,2,3,4,5,6,7,8,9};
for_each(testVector.begin(),testVector.end(),[=](int v){printf("value = %d\n",v);});
}
void LambdaTest::test5()
{
std::function<void()> fun = std::bind(&LambdaTest::test1,this);
fun();
}
待续