Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455922
  • 博文数量: 113
  • 博客积分: 446
  • 博客等级: 下士
  • 技术积分: 1229
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-09 16:01
个人简介

Let's go!!!!!

文章分类

全部博文(113)

文章存档

2019年(5)

2018年(4)

2017年(9)

2016年(5)

2015年(39)

2014年(6)

2013年(28)

2012年(17)

分类: C/C++

2017-02-20 23:25:07

例子1:
class Foo
{
 public:
  void methodA();
  void methodInt(int a);
};
class Bar
{
 public:
  void methodB();
};

boost::function f1; // 无参数,无返回值

Foo foo;
f1 = boost::bind(&Foo::methodA, &foo);
f1(); // 调用 foo.methodA();
Bar bar;
f1 = boost::bind(&Bar::methodB, &bar);
f1(); // 调用 bar.methodB();

f1 = boost::bind(&Foo::methodInt, &foo, 42);
f1(); // 调用 foo.methodInt(42);

boost::function f2; // int 参数,无返回值
f2 = boost::bind(&Foo::methodInt, &foo, _1);
f2(53); // 调用 foo.methodInt(53);

例子2:
// 企鹅能游泳,也能跑
class Penguin
{
 public:
  void run();
  void swim();
};


// 麻雀能飞,也能跑
class Sparrow
{
 public:
  void fly();
  void run();
};


// 以 closure 作为接口
typedef boost::function FlyCallback;
typedef boost::function RunCallback;
typedef boost::function SwimCallback;


// 一个既用到run,也用到fly的客户class
class Foo
{
 public:
  Foo(FlyCallback flyCb, RunCallback runCb) : flyCb_(flyCb), runCb_(runCb)
  { }

 private:
  FlyCallback flyCb_;
  RunCallback runCb_;
};

 

// 一个既用到run,也用到swim的客户class
class Bar
{
 public:
  Bar(SwimCallback swimCb, RunCallback runCb) : swimCb_(swimCb), runCb_(runCb)
  { }

 private:
  SwimCallback swimCb_;
  RunCallback runCb_;
};


int main()
{
  Sparrow s;
  Penguin p;
  // 装配起来,Foo要麻雀,Bar要企鹅。
  Foo foo(bind(&Sparrow::fly, &s), bind(&Sparrow::run, &s));
  Bar bar(bind(&Penguin::swim, &p), bind(&Penguin::run, &p));
}


阅读(774) | 评论(0) | 转发(0) |
0

上一篇:boost function

下一篇:linux 内核链表

给主人留下些什么吧!~~