如何在带有 lambda 表达式的类中使用 std::any_of?

How to use std::any_of inside a class with lambda expression?

提问人:Olivier D'Ancona 提问时间:9/4/2021 更新时间:9/5/2021 访问量:288

问:

我正在用机器人用 c++ 编写一个小型模拟,我需要检查机器人是否发生碰撞。我在模拟类中实现了这个函数:

bool World::isRobotColliding(Robot *r) {
    for (Robot *other_robot: robots) {
        double d = distance(r->getX(), r->getY(), other_robot->getX(), other_robot->getY());
        if ((r->getRadius() + other_robot->getRadius()) >= d) return true;
    }
    return false;
}

double World::distance(const double &x_1, const double &y_1, const double &x_2, const double &y_2) const {
    return sqrt((x_1 - x_2) * (x_1 - x_2) + (y_1 - y_2) * (y_1 - y_2));
}

在这里,我的IDE建议我用std::any_of()方法替换for循环。但是,我无法正确使用它。这是我尝试过的:

    return std::any_of(robots.begin(), robots.end(), [r, this](const Robot *&other_robot) {
        return
                (r->getRadius() + other_robot->getRadius())
                >=
                distance(r->getX(), r->getY(), other_robot->getX(), other_robot->getY());
    });

如何在我的上下文中使用 std::any_of()?

谢谢

C++ 指针 lambda std

评论

7赞 n. m. could be an AI 9/4/2021
“这就是我尝试过的” 那么结果是什么?如果有编译错误,请将它们添加到您的问题中。
1赞 Quimby 9/4/2021
请发布一个最小的可重复示例。我的猜测是 getter 没有标记.const
1赞 chris 9/4/2021
通过引用传递指针是否有特殊原因?
1赞 super 9/4/2021
不相关,但有一个只使用外部变量 (World::d istance) 的成员函数有点反模式。你可以把它变成一个免费的功能。
1赞 Remy Lebeau 9/5/2021
我会选择添加一个方法,将另一个作为参数,例如:然后让它在内部使用(它本身应该是或自由浮动的)。那么你就不需要在 lambda 中捕获了。然后,您可以通过添加一个方法来更进一步:RobotRobotr->distanceFrom(*other_robot)distance()staticthisisCollidingWith()Robotr->isCollidingWith(*other robot)

答:

0赞 Olivier D'Ancona 9/5/2021 #1

谢谢大家的建议,

问题出在通过引用传递的指针上。

    return std::any_of(robots.begin(), robots.end(), [r, this](const Robot *other_robot) {
        double d = distance(r->getX(), r->getY(), other_robot->getX(), other_robot->getY());
        if(d == 0) return false;
        return
                (r->getRadius() + other_robot->getRadius())
                >=
                d;
    });

这个片段完全符合我的期望。

我需要在上下文中传递第一个机器人以及.我本可以在我的机器人中声明一个距离函数并省略 .rthisthis