C ++ bind返回的仿函数的类型

时间:2014-10-11 05:15:21

标签: c++ functional-programming function

我目前正在用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的成员但该成员必须具有哪种类型,或者设计它的正确方法是什么?

2 个答案:

答案 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的魔力是在编译时使用模板完成的。