C ++のifステートメント内のラムダの戻り値をチェックする方法は?

Aug 24 2020

コンソールウィンドウのみを使用して小さなヘビゲームのチャレンジに取り組んでいますが、コンソールがクリアされるはずの描画機能でスタックし、グリッドと他のコンポーネント(ヘビ、尾、果物)を描画します

これがコードです:

void draw()
{
   system("cls");

   for(int h = 0;h < HEIGHT;h++)
   {
       for(int w = 0;w < WIDTH ; w++)
       {
           if(h == snake.y && w == snake.x)std::cout << snake.symbol;
           else if(        [&](){for(Snake::Tail T : snake.tails)
                           {if(T.x == w && T.y == h)return true;}return false;}
                            == true)
           {std::cout << snake.tailSymbol;}


           else if(h == fruit.y && w == fruit.x)std::cout << fruit.symbol;
           else std::cout << "O";
       }
       std::cout << "\n";
   }

}

紛らわしいように思えるかもしれませんが、これはグリッド内の各位置をループし、最初にヘビ(ヘビの頭)がその位置にあるかどうかを確認します。

それ以外の場合は、ラムダを使用してヘビに接続されたすべての尾のループを通過します

残りは重要ではありませんが、問題は、ifステートメントとforループを「else」チェーンを壊さずにマージするためにラムダを使用する必要があることですが、問題は、ラムダが戻るかどうかを確認しようとするとです。 trueまたはfalseエラーが発生します:

...Snake\main.cpp|40|error: no match for 'operator==' (operand types are 'draw()::<lambda()>' and 'bool')|

C ++でのラムダの経験はまだそれほど堅実ではありませんが、関数ではなくラムダを使用したいのですが、エラーを修正して値を確認するにはどうすればよいですか?

回答

3 cigien Aug 24 2020 at 00:51

ラムダ式を、bool許可されていないと比較しています。次のように、ラムダを呼び出して、得られた結果を比較する必要があります。

else if ([&]() {
             for (Snake::Tail T : snake.tails) {
                 if (T.x == w && T.y == h)
                     return true;
             }
             return false;
         }() // call it
    == true)

あなたがすることができるいくつかの単純化があります。手始めに、boolwith== trueとの比較は冗長であり、読みやすさには役立ちません。forループはこのように、アルゴリズムによって置き換えることができます。

else if ([&]() {
             return std::any_of(snake_tails.begin(), snake_tails.end(),
                 [&](auto T) {
                     return T.x == w && T.y == h;
                 });
         }())

ラムダから単一の値を返すだけなので、ラムダを完全に削除して、戻り値を使用するだけで済みます。

else if (std::any_of(snake_tails.begin(), snake_tails.end(),
             [&](auto T) {
                 return T.x == w && T.y == h;
             }))