boost bind

800阅读 0评论2017-02-20 下雨夜
分类:C/C++

例子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));
}


上一篇:boost function
下一篇:linux 内核链表