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 的说明就告一个段落了
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 的说明就告一个段落了
相关文章推荐
- 【STL】函数 for_each; bind1st和bind2nd,not1; mem_fun和mem_fun_ref;
- STL的bind1st,bind2nd,mem_fun,mem_fun_ref使用示例
- 函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例
- 【mem_fun/mem_fun_ref】成员函数作为函数对象使用
- STL(九):函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例
- C++之STL(九):函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例
- 从零开始学C++之STL(九):函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例
- 学习使用mem_fun、mem_fun_ref函数
- Stl中使类成员函数成为谓词,mem_fun 和mem_fun_ref的使用
- 从零开始学C++之STL(九):函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例
- my_mem_fun_ref将类成员函数转换为仿函数
- ptr_fun,mem_fun,mem_fun_ref的使用
- 了解使用ptr_fun、mem_fun和mem_fun_ref的原因2(Effective stl 条款41)
- 了解使用ptr_fun、mem_fun和mem_fun_ref的原因3(Effective stl 条款41)
- 关于函数适配器less< Type>以及bind1st和bind2nd的使用
- 关于for_each,mem_fun和bind1st在类内部组合使用的心得
- 使用ptr_fun、mem_fun和mem_fun_ref
- 了解使用ptr_fun、mem_fun和mem_fun_ref的原因1(Effective stl 条款41)
- 关于 mem_fun_ref 和 bind2nd的疑问
- for_each调用类成员函数,mem_fun, mem_fun_ref用法