C++ Erase-remove idiom with 对象
C++ Erase-remove idiom with object
编辑: @Holt 帮助了我,解决方案是如果 hasCollided 是非静态的,则传递一个 Engine 实例:
std::bind(&Engine::hasCollided, this, ball, _1);
我有一个函数 returns 判断砖块是否被球击中是真还是假。
我想擦除从向量中击中的砖块。
我设法使用简单的数字向量和 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>)> >]'
由于 hasCollided
不是静态函数,您需要将 Engine
的实例传递给 std::bind
。
假设您在 Engine
的方法中执行 erase/remove,您可以执行以下操作:
auto f = std::bind(&Engine::hasCollided, this, ball, _1);
// ^^^^
编辑: @Holt 帮助了我,解决方案是如果 hasCollided 是非静态的,则传递一个 Engine 实例:
std::bind(&Engine::hasCollided, this, ball, _1);
我有一个函数 returns 判断砖块是否被球击中是真还是假。
我想擦除从向量中击中的砖块。 我设法使用简单的数字向量和 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>)> >]'
由于 hasCollided
不是静态函数,您需要将 Engine
的实例传递给 std::bind
。
假设您在 Engine
的方法中执行 erase/remove,您可以执行以下操作:
auto f = std::bind(&Engine::hasCollided, this, ball, _1);
// ^^^^