boost::bind 函数绑定器

bind是一种非常神奇的存在,它不是一个单独的类或者函数,依据绑定的参数的个数和要绑定的调用对象的类型,总共有数十种不同的形式,编译器会根据具体的绑定代码制动确定要使用的正确的形式。


话不多说,直接上例子说用法。

1.bind绑定普通函数(函数指针)

定义函数

int f(int a,int b)
{
      return a + b;
}
int g(int a,int b,int c)
{
      return a + b + c;
}
typedef int (*f_pointer)(int,int);
typedef int (*g_pointer)(int,int,int);

调用范例

//普通函数
bind(f, 1, 2)();                       //f(1,2)
bind(f, _2, _1)(x, y);                 // f(y, x)
bind(g, _1, 9, _1)(x);                 // g(x, 9, x)
bind(g, _3, _3, _3)(x, y, z);          // g(z, z, z)
bind(g, _1, _1, _1)(x, y, z);          // g(x, x, x)
//函数指针
f_pointer fp = f;
g_pointer gp = g;
bind(pf,_1,9);                         //(*pf)(x,9)
bind(pg,_3,_2,_2)(x,y,z);              //(*pg)(z,y,y)

bind有两个参数表,第一个参数表是bind绑定的函数的参数表(即f和g的参数表),第二个参数表是bind生成的新的对象的参数表,其中,_1,_2…被称作占位符,至多可以有9个。

2.bind绑定成员函数

类的成员函数必须通过类的对象或者指针调用,因此在绑定时,bind要拿出第一个参数的位置来指定一个类的实例、指针或者引用。

class demo
{
public:
      int f(int a,int b){return a + b;}
};
demo a,&ra = a;    //类的实例对象和引用
demo * p = & a;     //指针
bind(&demo::f,a,_1,20)(10);       //a.f(10,20)
bind(&demo::f,ra,_2,_1)(10,20);   //a.f(20,10)
bind(&demo::f,p,_1,_2)(10,20);    //p->f(10,20)

注意:必须在成员函数前面加上取地址的操作符&。
再举一个例子:
bind搭配标准算法for_each用来调用容器中所有对象的print()函数

#include <boost/bind/bind.hpp>
using namespace boost;
struct point
{
      int x,y;
      point(int a = 0,int b = 0):x(a),y(b){}
      void print()
      {
            cout << " ( " << x << " , " << y << " ) \n ";  
      }
};
int main()
{
      vector<point> v(10);
      for_each(v.begin(),v.end(),bind(&point::print,_1));
}

这里的for_each()函数的作用是变量v中从begin开始到end结束,每一个成员都要调用print()函数。

3.bind绑定成员变量

bind可以绑定类中的public成员变量,依然用point类来说明。

#include <boost/bind/bind.hpp>
using namespace boost;
struct point
{
      int x,y;
      point(int a = 0,int b = 0):x(a),y(b){}
};
int main()
{
      vector<point> v(10);
      vector<int> v2(10);
      transform(v.begin().v.end().v2.begin(),bind(&point::x,_1));
}

该例中,transform()函数利用bind讲变量v中的成员x全部填入到变量v2中。

4.绑定函数对象

什么是函数对象?你不知道?函数对象其实是一个类的对象,只是因为这个类中重载了操作符,导致该对象调用这个操作符时,形式上看起来像个函数一样,其实它不是真的函数,不要被误导了哟。
首先来看一个函数对象的例子。

class FuncObjType
{
public:
      void operator()()
      {
            cout<<"hello C++"<<endl;
      }
}

当bind绑定函数对象时,当函数对象有内部类型定义result_type,则bind可以自动推到出返回值类型,但如果函数对象没用定义result_type,则需要用模板参数指明返回类型:bind<result_type>(functor,...);
由于boost库中大部分函数对象都有result_type,因此就可以直接使用bind,例如:

bind(std::greater<int>(),_1,10);
bind(std::plus<int>(),_1,_2);
bind(std::modulus<int>(),_1,3);

如果自定义函数对象,没有result_type的类型定义,就必须显示地在模板参数中指明bind的返回值类型:

struct func
{
      int operator()(int a,int b)
      {
            return a + b;
      }
};
cout<<bind<int>(func::obj(),_1,_2)(10,20)<<endl;

文章参考:
用法讲解:不破不立博客
工作机制探究:boost bind初步探究

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容