cocos2d-x で使う C++11文法 メモ

型推論

auto型で動的型付けの変数を定義できる。JSでのvarみたいなイメージ。

auto a = 10;
auto b = “string”;
auto object = new Object();

ラムダ

従来のC++では、関数を変数として扱いたいときは、関数ポインタを用いてた。

int a(int x, int y){
    return x+y;
}

int main(){
    int (*func)(int, int); // 関数ポインタ定義
    func = a;
    std::cout << func(1,2) << std::endl;
    return 0;
}

基本

ラムダを用いると

int main(){
    std::function<int (int, int)> func = [](int x, int y)->int {
        return x+y;
     };
    std::cout << func(1,2) << std::endl;
    return 0;
}

と書ける。

ラムダの書き方は以下のとおり。

std::function<returnValue (arg1Type, arg2Type,...)> functionName>;
// もしくは  
[capture][argList]->returnValue{};

宣言時には

auto sumNumbers = [](int a, int b){return a+b};  

と書くと簡単。

キャプチャ

ラムダ外の変数を使用したい場合は、[ ]に=を入れる。

int number = 30;
auto lamda = [=](int a){      // [] => [=] にしている(コピーキャプチャ)
    return number + a;
     };
number = 20;
std::cout << lamda(5) << std::endl;

[&]にすることでコピーではなく参照でもってこれる。

スコープ付きenum

スコープ付きのenumを宣言できる。 同名の値でも別のスコープとして扱える。

enum class Gender {MAN, WOMAN, UNKNOWN};
enum class Animal {MAN, MONKEY, OTHER};

Gender gender = Gender::MAN;
Gender animal = Animal::MAN;

Range-based for loop

Python

for i in {1,2,3,4,5}:
    print i

に似てるやつ。foreach って言うのだろうか。

それが以下のとおりに書ける。

auto animals = {"dog", "cat", "bird"};
for (auto animal : animals){
    std::cout << animal << std::endl;

ムーブ・セマンティクス

コピーではなく、あくまで移動のイメージ。 処理時間が少し短くなるらしい。

vector<int> src = {0,1,2,3,4,5};
vector<int> dst;
dst = move(src);
std::cout << dst[1] << std::endl;