我正在尝试在课程中使用this问题中提供的解决方案。我在类中使用了“remove_if”和谓词函数。
void classname::function1()
{
vector<NeighborPoint> neighbors;
....
neighbors.erase(std::remove_if(neighbors.begin(),neighbors.end(),&classname::cannotMoveIn), neighbors.end());
...
}
bool classname::cannotMoveIn(NeighborPoint mp)
{
return !mp.inGridNotOccupied;
}
如果代码不在类中并且谓词不是成员函数,那么该代码将起作用。但是,现在我收到很长的错误消息,我想这是指remove_if模板与谓词参数的不兼容性(一个错误包括:错误C2064:术语不评估为带有1个参数的函数)。
注意:代码打算删除代理无法进入的相邻网格单元格(8个可能的单元格中)。
有没有人知道出了什么问题?
答案 0 :(得分:1)
使用std::bind
:
neighbors.erase(std::remove_if(neighbors.begin(),neighbors.end(),std::bind(&classname::cannotMoveIn, this, std::placeholders::_1)), neighbors.end());
此外,正如@Als指出的那样,您的classname::cannotMoveIn
方法将MoorePoint
作为参数,而您的向量包含NeighborPoint
。请注意,即使这些clases是相关的,您也会对矢量的对象进行切片(因为您按值获取参数)。
我相信你的方法应该有以下签名:
bool classname::cannotMoveIn(const NeighborPoint &mp) const;
答案 1 :(得分:1)
如果代码不在类中并且谓词是,则该代码将起作用 不是会员功能。
当然。实例方法不像全局函数;它需要一个额外的隐藏参数this
(它被调用的对象)。但似乎您根本不需要在函数中使用当前对象。你为什么一开始就把它作为实例方法?
如果您不需要使用this
,那么您可以做的一件事就是将其设为静态方法(除了范围外,它就像常规函数一样)。然后你可以像往常一样将它传递给常规函数。甚至比谓词函数更好的是使用函数对象(你必须定义一个仿函数类,如果你不想将它移出类,它甚至可以是一个嵌套类)或一个lambda(如果你有C) ++ 11),它允许将谓词内联到remove算法中,因此比每次调用函数指针要快。