c++ - 如何在 C++ 中的 if 语句中检查 lambda 的返回值?

标签 c++ lambda

我正在仅使用控制台窗口进行小型蛇游戏挑战,我陷入了应该清除控制台的绘图功能,然后绘制网格和其他组件(蛇,尾部和水果)
这是代码:

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

}
它可能看起来令人困惑,但它在网格中的每个位置循环并首先检查蛇(蛇的头部)是否在该位置,
否则,它会通过使用 LAMBDA 连接到蛇的所有尾部的循环
其余的并不重要,但问题是我必须使用 lambda 才能将 if 语句和 for 循环合并在一起而不会破坏“else”链,但问题是当我尝试检查 lambda 是否返回真或假我得到错误:
...Snake\main.cpp|40|error: no match for 'operator==' (operand types are 'draw()::<lambda()>' and 'bool')|
我在 C++ 中使用 lambda 的经验还不是很可靠,但我仍然想使用 lambda 而不是函数,如何修复错误并检查值?

最佳答案

您正在将 lambda 表达式与 bool 进行比较,这是不允许的。您需要调用 lambda 并比较您得到的结果,如下所示:

else if ([&]() {
             for (Snake::Tail T : snake.tails) {
                 if (T.x == w && T.y == h)
                     return true;
             }
             return false;
         }() // call it
    == true)
您可以进行多种简化。对于初学者,与 bool 的比较与 == true是多余的,不利于可读性。 for循环可以用算法代替,如下所示:
else if ([&]() {
             return std::any_of(snake_tails.begin(), snake_tails.end(),
                 [&](auto T) {
                     return T.x == w && T.y == h;
                 });
         }())
由于您现在只是从 lambda 返回一个值,因此您可以完全删除 lambda,而只需使用返回值:
else if (std::any_of(snake_tails.begin(), snake_tails.end(),
             [&](auto T) {
                 return T.x == w && T.y == h;
             }))

关于c++ - 如何在 C++ 中的 if 语句中检查 lambda 的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63550227/

相关文章:

C++ Lambda 捕获弄乱了局部变量值

recursion - 解释 The Little Schemer 第 137 页上的延续示例

c++ - 如何独立于所用机器测量性能

c++ - 使用 IPython 调试 C/C++ 代码

c++ - 如何创建将枚举作为参数/参数并返回它的 C++ 函数?

java - 如何找到 List<E> 中的最小值?

C++:如何在不进行舍入、截断或填充的情况下将 float 转换为字符串?

c++ - 类声明中的 BOOST_FILESYSTEM_DECL 是什么意思?

haskell - 这个haskell函数中的这些值来自哪里?

c# lambda表达式+思考题