标签:review preview std family int names 通过 name mem
function、bind是tr1里的特性,已被集成到C++0x/C++11
1、使用tr1
头文件:
<tr1/functional>
std::tr1::function
std::tr1::bind
std::tr1::placeholders::_N
2、使用C++0x/11
头文件:
<functional>
std::function
std::bind
std::placeholders::_N
bind将已有函数 与 特定参数绑定到一起,返回为新的可调用对象function供以使用
现有一个减法计算函数:
using namespace std::tr1;
using namespace std::tr1::placeholders;
int calcSub(int a, int b) { return a - b; }
function<int()> fun = bind(&calcSub, 10, 3);
使用bind把calcSub与实参10、3绑定起来,于是产生了一个int(void)
类型的函数(可调用对象)
于是,调用fun: fun()
等价于calcSub(10,3)
function<int(int)> fun = bind(&calcSub, 10, _1);
即bind产生了calcSub(10, _1)
的可调用对象fun
其中,占位符_1
表示:fun
的第1个参数将作为calcSub的第二个参数
于是fun
有一个参数,类型=calcSub第二个参数的类型=int
那么:fun(3)
等价于calcSub(10,3)
placeholders::_N表示生成的可调用对象的第N个参数
function<int(int,int)> fun = bind(&calcSub, _2, _1);
即bind产生了calcSub(_2,_1)
的可调用对象fun
并通过占位符声明:fun的第2个参数将作为calcSub的第一个参数(int),fun的第1个参数将作为calcSub的第二个参数(int)
于是fun
有两个参数,且类型均为int
那么:fun(10,3) = calcSub(3,10)
假如有类:
class MyClass {
public:
void memfun(int a, string b) { ... }
};
则想绑定成员函数calcSub,则不能忘记calcSub的第一个参数是MyClass* this
MyClass ins;
function<void(string,int)> fun = bind(&MyClass::memfun, &ins, _2, _1);
_2声明了:fun的第2个参数作为memfun的第二个参数(int)
_1声明了:fun的第1个参数作为memfun的第三个参数(string)
于是,fun参数为string,int
那么:func("xxx", 10)等价于ins.calcSub(10, "xxx");
标签:review preview std family int names 通过 name mem
原文地址:https://www.cnblogs.com/cppprogamming/p/9537537.html