come controllare il valore di ritorno di un lambda all'interno di un'istruzione if in c ++?

Aug 24 2020

Sto lavorando a una piccola sfida di gioco del serpente usando solo la finestra della console e sono rimasto bloccato nella funzione di disegno in cui la console dovrebbe essere cancellata, quindi disegna la griglia e gli altri componenti (serpente, coda e frutta)

e questo è il codice:

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";
   }

}

può sembrare confuso ma ciò che fa passa attraverso ogni posizione nella griglia e controlla prima se il serpente (la testa del serpente) si trova in quella posizione,

altrimenti passa attraverso un anello di tutte le code collegate al serpente USANDO UN LAMBDA

il resto non è importante ma il problema è che ho dovuto usare un lambda per unire l'istruzione if e il ciclo for senza rompere la catena "else", ma il problema è che quando provo a controllare se il lambda ritorna vero o falso ottengo l'errore:

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

la mia esperienza con lambda in c ++ non è ancora così solida ma voglio comunque usare lambda piuttosto che una funzione, come posso correggere l'errore e controllare il valore?

Risposte

3 cigien Aug 24 2020 at 00:51

Stai confrontando un'espressione lambda con a bool, il che non è consentito. Devi chiamare lambda e confrontare il risultato che ottieni, in questo modo:

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

Ci sono diverse semplificazioni che potresti fare. Per i principianti, il confronto boolcon == trueè ridondante e non aiuta la leggibilità. Il forciclo può essere sostituito da un algoritmo, come questo:

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

Poiché ora stai solo restituendo un singolo valore da lambda, puoi eliminare completamente lambda e utilizzare semplicemente il valore restituito:

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