您的位置:首页 > 其它

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

2011-06-21 18:03 459 查看
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 的说明就告一个段落了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: