VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 902|回复: 0

[交流] boost 之 function and bind

[复制链接]
008
74_avatar_middle
在线会员 发表于 2016-8-13 22:44:59 | 显示全部楼层 |阅读模式
近日因些可悲的原因 無奈在看c# 看到其中 所謂的 委託 立刻 想起來 boost::function 然 和 function 比起來 委託 除了 有個 沒什麼意思的 異步調用外 簡直沒點意思

boost::function 是對一個 functor 的包裝(內部 保存期 副本) 讓使用者 可以 延遲 調用 functor
boost::bind 是一個 強大的 函數適配器 可以 將 functor 包裝成其他簽名形式的 boost::function

boost::function
boost::function 接受一個 模板參數 指定 函數簽名 以及一個 符合 簽名的 函數 進行 構造
同時 boost::function 重載了 operator() 可以像 一般 functor一樣 調用 function
  1. #include <boost/function.hpp>

  2. void show()
  3. {
  4.         puts("cerberus it's an idea");
  5. }
  6. int show_sum(int l,int r)
  7. {
  8.         int sum = l + r;
  9.         printf("%d+%d=%d\n",l,r,sum);
  10.         return sum;
  11. }
  12. void swap(int& l,int& r)
  13. {
  14.         int tmp = l;
  15.         l = r;
  16.         r = tmp;
  17. }
  18. int _tmain(int argc, _TCHAR* argv[])
  19. {
  20.         boost::function<void()> func(show);
  21.         func();

  22.         boost::function<void(int,int)> func_sum(show_sum);
  23.         func_sum(1,2);

  24.         boost::function<void(int&,int&)> func_swap(swap);
  25.         int l = 3;
  26.         int r = 4;
  27.         func_swap(l,r);
  28.         
  29.         printf("l=%d r=%d\n",l,r);
  30.         return 0;
  31. }
复制代码


boost::bind
單獨 使用 boost::function 其不過是可能 比使用 函數指針 看起多些函數信息罷了
而且 對於c/c++這種 追求效率的語言來說 是在增加 函數調用 成本 (雖然成本很小)

然一般 都是 將 boost::function 和 boost::bind 配合 使用 boost::bind 可以將 一個簽名的 函數調用 適配到 其他簽名形式
想像下 你不需要寫 多餘的代碼 只需要 調用 bind 返回一個 適配的 function 之後 就可以直接 使用 新的 接口 操作原有接口
對於 不同 c++ 開源庫 提供的 不同風格 api 現在 你可以 輕易的 適配到 適合你的 項目

而且 這意味着 使用 boost::function 作為 接口 你可以 很容易的 為接口調用 添加 新的調用信息 而保證 和以前的 有同樣的 簽名

bind 接受 一個 函數定義 以及 最多9個 調用 參數
調用 bind 時 可以使用 _1 _2 ... _9 9個佔位符 代表 原 functor 需要的 參數 這些佔位符 將在 調用 返回的 boost::function 時 進行 傳入
  1. #include<boost/bind.hpp>

  2. class Test
  3. {
  4. public:
  5.         Test()
  6.         {
  7.                 value        =        0;
  8.         }
  9.         int value;
  10.         void add(const int a,const int b)
  11.         {
  12.                 value = a + b;
  13.                 std::cout<<value<<std::endl;
  14.         }

  15.         typedef int result_type;
  16.         result_type        operator()(const int a,const int b)
  17.         {
  18.                 return a + b;
  19.         }
  20. };

  21. int _tmain(int argc, _TCHAR* argv[])
  22. {
  23.         //綁定普通函數 函數指針
  24.         boost::bind(puts,"bind")
  25.                 ();        //operator () 引發真實的 調用

  26.         //使用佔位符
  27.         boost::bind(puts,_1)
  28.                 ("bind _1");        //佔位符 以便在 () 時才傳入參數
  29.         boost::bind(puts,_2)
  30.                 ("第一個參數被忽略","bind _2");

  31.         //綁定成員函數
  32.         Test t;
  33.         boost::bind(&Test::add,
  34.                 t,        //此處 會 創建 新的clas 並創建其副本 調用 add 函數 如果需要調用當前實例的 add 需要傳入指針 &t
  35.                 _1,_2)
  36.                 (10,20);

  37.         //綁定成員變量
  38.         t.value        =        1;
  39.         std::cout<<boost::bind(&Test::value,&t)()<<"\n";

  40.         //綁定函數對象
  41.         //若未定義 result_type 需要 在模板傳入 返回值型別 bind<int<(Test(),1,2)
  42.         std::cout<<boost::bind(Test(),1,2)()<<"\n";
  43.         
  44.         std::system("pause");
  45.         return 0;
  46. }
复制代码




上一篇:boost 中文翻译包,来源于google翻译组的分享
下一篇:VC实现Win7任务栏编程
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-7-22 06:04

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表