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;