我目前正在用C ++编写国际象棋程序。用于搜索的算法是alphaBeta,这就是为什么我在移动它们并评估它们之前对它们进行排序的原因。我的主要类是Position类,它执行所有搜索,还包含一个比较两个Move的函数。
class Position{
private:
//This vector holds the moves of the current line, to be evaluated
vector<Move> currentSearch(4000);
// This function uses internal fields of class Position to determine, whether move1 or move2 should be searched first
bool compare(const Move& move1, const Move& move2);
int alphaBeta(int ply, int depth, int alpha, int beta);
}
现在要对currentSearch中的移动进行排序,我总是调用alphaBeta
sort(currentSearch.begin(), currentSearch.end(), bind(mem_fn(&Position::compare),this,_1,_2));
所以用bind(mem_fn(&Position::compare),this,_1,_2));
生成一个仿函数
在一次搜索中完成几次以生成相同的仿函数。
我希望有一个初始化为bind(mem_fn(&Position::compare),this,_1,_2));
的类Position的成员但该成员必须具有哪种类型,或者设计它的正确方法是什么?
答案 0 :(得分:3)
我猜您使用的是c ++ 11,因为std::bind
在以前的版本中不可用。
来自http://en.cppreference.com/w/cpp/utility/functional/bind:
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
显然,标准委员会不希望将实施细节硬编码到标准中。
因此,如果确实需要将仿函数存储在某处,最好的选择是编写自己的仿函数类,而不是使用lambda或std::bind
。第二个最佳选择是使用std::function
。它可以存储任何具有兼容签名的函数,但是存在运行时间接的开销,这可能是您不想要的。
或者你可以复制并粘贴相同的行,或者如果在同一个函数中重用仿函数,则使用auto
。
顺便说一句,使用mem_fun
时无需std::bind
。
答案 1 :(得分:0)
根据我对boost.bind(std bind基于)的经验,提前捕获结果并没有太大意义。如上所述,类型相当奇怪,只在编译期间存在。
这就是重点。 bind之后的大部分工作都是在编译时完成的。类的初始化是微不足道的,就像使用bind时调用函数一样。
根据我的经验,bind的魔力是在编译时使用模板完成的。