LoginSignup
8
12

More than 5 years have passed since last update.

C++ : ラムダ式のみでの再帰文

Last updated at Posted at 2015-10-24

以前、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++楽しいです。

8
12
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12