程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> boost::bind四種應用場景的例子

boost::bind四種應用場景的例子

編輯:C++入門知識

[cpp]   int f(int a, int b)   {       return a + b;   }      int g(int a, int b, int c)   {       return a + b + c;   }      // 函數指針定義   typedef int (*f_type) (int, int);   typedef int (*g_type) (int, int, int);      // 使用struct僅僅是為了方便, 不必寫出public   struct demo   {       int f(int a, int b)       {           return a + b;       }   };      // 函數對象   struct sf    {       int operator()(int a, int b)       {           return a + b;       }   };      void test_bind_common()   {       std::cout << boost::bind(f, 1, 2)() << std::endl;       std::cout << boost::bind(g, 1, 2, 3)() << std::endl;   }      // 1. 普通函數應用boost::bind   void test_bind_fun1()   {   //  bind(f, _1, 9)(x);             // f(x, 9), 相當於bind2nd(f, 9)   //  bind(f, _1, _2)(x, y);         // f(x, y)   //  bind(f, _2, _1)(x, y);         // f(y, x)   //  bind(f, _1, _1)(x, y);         // f(x, x), y參數被忽略   //  bind(g, _1, 8, _2)(x, y);      // g(x, 8, y)   //  bind(g, _3, _2, _2)(x, y, z);  // g(z, y, y), x參數被忽略          int x = 1, y = 2, z = 3;       std::cout << boost::bind(f, _1, 9)(x) << std::endl;       std::cout << boost::bind(f, _1, _2)(x, y) << std::endl;       std::cout << boost::bind(f, _2, _1)(x, y) << std::endl;       std::cout << boost::bind(f, _1, _1)(x, y) << std::endl;       std::cout << boost::bind(g, _1, 8, _2)(x, y) << std::endl;       std::cout << boost::bind(g, _3, _2, _2)(x, y, z) << std::endl;   }      // 2. 成員函數應用boost::bind   void test_bind_fun2()   {       demo a, &ra = a;       demo *p = &a;          // 必須在成員函數前加上取地址操作符&, 表明這是一個成員函數指針       // 第二個參數用struct demo, struct demo * 兩個類型都可以       std::cout << boost::bind(&demo::f, a, _1, 20)(10) << std::endl;       std::cout << boost::bind(&demo::f, ra, _2, _1)(10, 20) << std::endl;       std::cout << boost::bind(&demo::f, p, _1, _2)(10, 20) << std::endl;   }      // 3. 成員變量   void test_bind_val()   {       typedef std::pair<int, std::string> pair_t;       pair_t p(123, "string");       std::cout << boost::bind(&pair_t::first, p)() << std::endl;       std::cout << boost::bind(&pair_t::second, p)() << std::endl;   }      // 4. 函數對象   void test_bind_functor()   {       std::cout << boost::bind(std::plus<int>(), _1, _2)(10, 20) << std::endl;       std::cout << boost::bind(std::modulus<int>(), _1, 3)(11) << std::endl;       std::cout << std::boolalpha << boost::bind(std::greater<int>(), _1, 10)(20) << std::endl;          std::cout << boost::bind<int>(sf(), _1, _2)(11, 22) << std::endl;   }      // 可以使用ref庫包裝了對象的引用,可以讓bind 存儲對象引用的拷貝,從而降低了拷貝的代價。   void test_bind_ref()   {       // 變量       int x = 10;       // 11 + 10 + 10       std::cout << boost::bind(g, _1, boost::cref(x), boost::ref(x))(11) << std::endl;              // 一個函數對象       sf af;       std::cout << boost::bind<int>(boost::ref(af), _1, _2)(11, 22) << std::endl;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved