以前、Cocos2d-xを利用する際に再帰文を書こうとしたらやり方がよくわかんなかったので調べた。
int main()
{
std::function<void(int)> hoge = [&hoge](int i)
{
if(i == 5) return ;
printf("%d", i);
hoge(++i);
};
hoge(0);
}
重要なのはどうキャプチャするか。
[=]での代入だと、初期化が完了していない段階でキャプチャするのでnullを代入することになり、
ラムダ内での自身の呼び出しに失敗する。
正解は[&]での参照で自身をキャプチャする方法。
こうすることでラムダのみで再帰を実現することが出来ます。
以下おまけ。
auto hoge = [&hoge]()
{
};
これは無理。
ラムダで宣言する場合、コンパイル時に型が決まっていないといけないけれど、これだと同時に型不明のオブジェクトをキャプチャすることになって型解決できずにエラーになる。
template<T>
std::function<void()> hogehoge = [&hogehoge](T)
{
};
これも無理。
そもそもテンプレートがラムダ式に適用出来ないから当然。
残念。C98で止まってる人もC++11を楽しんでる人もそこまで。さよならー
###けどC++14なら全て解決する。
autoでのラムダ宣言も許されるしテンプレート化も可能。
ほとんどどっかに書いてあったことの受け売りだけど、要約するとCocos2d-xをC++14で書ける環境って良いですよね。
C++楽しいです。