码迷,mamicode.com
首页 > 编程语言 > 详细

C++11之function和bind

时间:2018-08-26 16:43:16      阅读:233      评论:0      收藏:0      [点我收藏+]

标签: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; }
 
1、绑定所有参数
function<int()> fun = bind(&calcSub, 10, 3); 

使用bind把calcSub与实参10、3绑定起来,于是产生了一个int(void)类型的函数(可调用对象)

于是,调用fun: fun()等价于calcSub(10,3)

2、绑定若干参数
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)

3、bind也可以绑定类成员函数

假如有类: 

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");

C++11之function和bind

标签:review   preview   std   family   int   names   通过   name   mem   

原文地址:https://www.cnblogs.com/cppprogamming/p/9537537.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!