C ++擦除 - 删除对象的习语

时间:2017-04-07 09:30:01

标签: c++ oop collision-detection erase-remove-idiom

编辑: @Holt对我有帮助,解决方案是如果hasCollided是非静态的,则传递Engine实例:

std::bind(&Engine::hasCollided, this, ball, _1);

我有一个函数,无论砖是否被球击中,都会返回true或false。

我想要擦除从矢量中击中的砖块。 我设法使用简单的数字向量和bool函数来处理这个习惯用法,但是当我尝试使用对象向量时,我会遇到奇怪的错误。

私人会员:

Ball ball;
std::vector<Brick> bricks;

碰撞检查:

bool Engine::hasCollided(Ball& object1, Brick& object2)
{
    //do some checks
    return 1;
}

我的尝试:

using namespace std::placeholders;

auto f = std::bind(hasCollided, ball, _1);
bricks.erase(std::remove_if(bricks.begin(), bricks.end(), f), bricks.end());

此处predefined_ops.h发生错误:

template<typename _Iterator>
    bool
    operator()(_Iterator __it)
    { return bool(_M_pred(*__it)); }
    };

编译器吐出92个错误。请帮我解决这个问题

示例错误:

required from '_ForwardIterator std::__remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Game::Brick*, std::vector<Game::Brick> >; _Predicate = __gnu_cxx::__ops::_Iter_pred<std::_Bind<std::_Mem_fn<bool (Game::Engine::*)(Game::Ball&, Game::Brick&)>(Game::Ball, std::_Placeholder<1>)> >]'

1 个答案:

答案 0 :(得分:0)

由于hasCollided不是静态函数,因此您需要将Engine的实例传递给std::bind

假设您正在Engine的方法中进行删除/删除,您可以执行以下操作:

auto f = std::bind(&Engine::hasCollided, this, ball, _1);
//                                       ^^^^