在C++中将多个参数绑定到成员函数

Ari*_*Ari 6 c++ lambda bind c++11

假设我有A成员函数的类,int f() { return m_; }其中m_是数据成员.我有一个vector<A>被叫vec,我想m_vec使用中找到具有最大价值的对象std::max_element.我可以用lambda做到这一点:

auto cmp = [] (A& x, A& y) { return x.f() < y.f(); };
A& max_elem = *std::max_element(vec.begin(), vec.end(), cmp);
Run Code Online (Sandbox Code Playgroud)

是否有一些bind(或某些这样的)技巧可以让我在没有lambda的情况下完成它并且不从头开始定义我自己的比较器?请不要建议更好的方法来解决最大发现问题.这只是一个例子.一般的问题是如何包装一个带有多个参数的函数对象(例如,std::less<int>我将用作上例中的比较器),使得发送给它的参数通过其他函数(或成员)在达到它之前.

Rei*_*ica 11

就在这里:

using namespace std::placeholders;
A& max = *std::max_element(begin(vec), end(vec)
    , std::bind(
        &std::less<int>::operator()
        , std::less<int>()
        , std::bind(&A::f, _1)
        , std::bind(&A::f, _2)
    )
);
Run Code Online (Sandbox Code Playgroud)

实例

但是,如果我在代码审查中看到这一点,我会立即说"将丑陋变成一个lambda".


感谢@nm让代码可以缩短一点:

using namespace std::placeholders;
A& max = *std::max_element(begin(vec), end(vec)
    , std::bind(
        std::less<int>()
        , std::bind(&A::f, _1)
        , std::bind(&A::f, _2)
    )
);
Run Code Online (Sandbox Code Playgroud)

实例

不过,我仍然认为lambda更具可读性.请记住,您可以在调用中直接使用lambda max_element()(不需要cmp原始代码中的变量).

  • `operator()`被称为`operator()`有一个原因:当你想调用它时你不必命名它;)`std :: bind(std :: less <int>(),std: :bind(&A :: f,_ 1),std :: bind(&A :: f,_2))`就足够了. (2认同)