bind1st, bind2nd, mem_fun, mem_fun_ref,这三个函数的使用

bind1st, bind2nd, mem_fun, mem_fun_ref,这三个函数的使用

bind1st 为一个有两个参数的函数绑定第一个参数, 名字已经很明确了 bind first parameter
bind2nd 为一个有两个参数的函数绑定第二个参数.

什么时候使用呢?
当我们的回调函数有两个参数,可是程序代码在调用这个回调的时候,只有一个参数,怎么办呢,这时候就可以用 bind1st 或者 bind2nd. 那么到的是用 bind1st 还是 bind2nd 呢, 这个时候就要看 回调的参数和你需要的参数的顺序了,如果例程代码调用你的回调函数传入的参数,其实是你想要的第二个参数,那么就用 bind1st(para1, para2) 在para2 中传入你的第一个参数;同理,如果例程代码调用你的回调函数传入的参数,其实是你想要的第一个参数,那么就用 bind2nd(para1, para2) 在para2 中传入你的第二个参数,是不是很简单

在说 mem_fun, mem_fun_ref
这是调用 成员函数, 有 _ref 的很明显是 调用 类引用 的成员函数, mem_fun 并不是调用类的成员函数,是类指针 的成员函数

// mem_fun example
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;


class CPerson
{
public:
    CPerson(string name):m_name(name)
    {

    }
    virtual ~CPerson()
    {

    }

    void printname()
    {
        cout << m_name << endl;
    }
   
    void printcompany( string strcompany)
    {
        cout << m_name << " " << strcompany << endl;
    }
   
private:
    string m_name;
};

int _tmain(int argc, _TCHAR* argv[])
{
    CPerson p1("tom");
    CPerson p2("jerry");
    vector <CPerson> vecperson;
    vecperson.push_back(p1);
    vecperson.push_back(p2);
    for_each(vecperson.begin(), vecperson.end(), mem_fun_ref(&CPerson::printname));
   

    //
    // mem_fun
    //
    CPerson * pp1 = &p1;
    CPerson * pp2 = &p2;
   
    vector <CPerson*> vecpersonptr;
    vecpersonptr.push_back(pp1);
    vecpersonptr.push_back(pp2);
    for_each(vecpersonptr.begin(), vecpersonptr.end(), mem_fun(&CPerson::printname));
    return 0;
}

如果我的成员函数有参数那又该怎么办呢?
很自然我们想到 bind1st(mem_fun, ...) bind1st(mem_fun_ref, ...);且慢,到底是bind1st 还是 bind2nd 呢,这个就要看具体代码了,如本例的 printcompany,他的参数 strcompany 就是第二个参数,为嘛是第二个参数不解释了,所以应该是 bind2nd(..., ...)

    for_each(vecpersonptr.begin(), vecpersonptr.end(), bind2nd(mem_fun(&CPerson::printcompany), "abc") );
   
什么?你想看看 bind1st 的例子,这个也好办需要多加几行代码
   
    vector <string> vecstring;
    vecstring.push_back("abc");
    vecstring.push_back("def");
    for_each(vecstring.begin(), vecstring.end(), bind1st(mem_fun(&CPerson::printcompany), pp1) );
   
最终的代码就是这个样子
int _tmain(int argc, _TCHAR* argv[])
{
    CPerson p1("tom");
    CPerson p2("jerry");
    vector <CPerson> vecperson;
    vecperson.push_back(p1);
    vecperson.push_back(p2);
    for_each(vecperson.begin(), vecperson.end(), mem_fun_ref(&CPerson::printname));
   

    //
    // mem_fun
    //
    CPerson * pp1 = &p1;
    CPerson * pp2 = &p2;
   
    vector <CPerson*> vecpersonptr;
    vecpersonptr.push_back(pp1);
    vecpersonptr.push_back(pp2);
    for_each(vecpersonptr.begin(), vecpersonptr.end(), mem_fun(&CPerson::printname));


    for_each(vecpersonptr.begin(), vecpersonptr.end(), bind2nd(mem_fun(&CPerson::printcompany), "abc") );
   
    vector <string> vecstring;
    vecstring.push_back("abc");
    vecstring.push_back("def");
    for_each(vecstring.begin(), vecstring.end(), bind1st(mem_fun(&CPerson::printcompany), pp1) );

    return 0;
}
还想看 mem_fun_ref 的例子,好贪心呀
for_each(vecperson.begin(), vecperson.end(), bind2nd(mem_fun_ref(&CPerson::printcompany), "abc") );
for_each(vecstring.begin(), vecstring.end(), bind1st(mem_fun_ref(&CPerson::printcompany), p1) );
好大功告成,编译,嗯,出错了
for_each(vecstring.begin(), vecstring.end(), bind1st(mem_fun_ref(&CPerson::printcompany), p1) ); compile error
为嘛嗫?
仔细看源码,呵呵原来是 const 的问题 bind1st 的两个参数都是 const 类型, 可是 mem_fun_ref 的参数偏偏不要const的
看来 bind1st 和 mem_fun_ref 不兼容呀

怎么办呢???????

也好办 直接把 CPerson::printcompany() 变成 CPerson::printcompany() const 的形式就好了

 

最终代码:

 

class CPerson
{
public:
    CPerson(string name):m_name(name)
    {
    }
    virtual ~CPerson()
    {

    }

    void printname()
    {
        cout << m_name << endl;
    }

    void printcompany( string strcompany) const
    {
        cout << m_name << " " << strcompany << endl;
    }
private:
    string  m_name;
};

 

int _tmain(int argc, _TCHAR* argv[])
{
    CPerson p1("tom");
    CPerson p2("jerry");
    vector <CPerson> vecperson;
    vecperson.push_back(p1);
    vecperson.push_back(p2);
    for_each(vecperson.begin(), vecperson.end(), mem_fun_ref(&CPerson::printname));

    for_each(vecperson.begin(), vecperson.end(), bind2nd(mem_fun_ref(&CPerson::printcompany), "abc") );
   
    //
    // mem_fun
    //
    CPerson * pp1 = &p1;
    CPerson * pp2 = &p2;
   
    vector <CPerson*> vecpersonptr;
    vecpersonptr.push_back(pp1);
    vecpersonptr.push_back(pp2);
    for_each(vecpersonptr.begin(), vecpersonptr.end(), mem_fun(&CPerson::printname));

    for_each(vecpersonptr.begin(), vecpersonptr.end(), bind2nd(mem_fun(&CPerson::printcompany), "abc") );

    vector <string> vecstring;
    vecstring.push_back("abc");
    vecstring.push_back("def");
    for_each(vecstring.begin(), vecstring.end(), bind1st(mem_fun(&CPerson::printcompany), pp1) );

    for_each(vecstring.begin(), vecstring.end(), bind1st(mem_fun_ref(&CPerson::printcompany), p1) );

    return 0;

}

bind1st bind2st, mem_fun, mem_fun_ref 的说明就告一个段落了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值