【Boost】boost::bind四种应用场景的例子

来源:转载

【Boost】boost::bind四种应用场景的例子,有需要的朋友可以参考下。


[cpp]view plaincopyprint?
  1. intf(inta,intb)
  2. {
  3. returna+b;
  4. }
  5. intg(inta,intb,intc)
  6. {
  7. returna+b+c;
  8. }
  9. //函数指针定义
  10. typedefint(*f_type)(int,int);
  11. typedefint(*g_type)(int,int,int);
  12. //使用struct仅仅是为了方便,不必写出public
  13. structdemo
  14. {
  15. intf(inta,intb)
  16. {
  17. returna+b;
  18. }
  19. };
  20. //函数对象
  21. structsf
  22. {
  23. intoperator()(inta,intb)
  24. {
  25. returna+b;
  26. }
  27. };
  28. voidtest_bind_common()
  29. {
  30. std::cout<<boost::bind(f,1,2)()<<std::endl;
  31. std::cout<<boost::bind(g,1,2,3)()<<std::endl;
  32. }
  33. //1.普通函数应用boost::bind
  34. voidtest_bind_fun1()
  35. {
  36. //bind(f,_1,9)(x);//f(x,9),相当于bind2nd(f,9)
  37. //bind(f,_1,_2)(x,y);//f(x,y)
  38. //bind(f,_2,_1)(x,y);//f(y,x)
  39. //bind(f,_1,_1)(x,y);//f(x,x),y参数被忽略
  40. //bind(g,_1,8,_2)(x,y);//g(x,8,y)
  41. //bind(g,_3,_2,_2)(x,y,z);//g(z,y,y),x参数被忽略
  42. intx=1,y=2,z=3;
  43. std::cout<<boost::bind(f,_1,9)(x)<<std::endl;
  44. std::cout<<boost::bind(f,_1,_2)(x,y)<<std::endl;
  45. std::cout<<boost::bind(f,_2,_1)(x,y)<<std::endl;
  46. std::cout<<boost::bind(f,_1,_1)(x,y)<<std::endl;
  47. std::cout<<boost::bind(g,_1,8,_2)(x,y)<<std::endl;
  48. std::cout<<boost::bind(g,_3,_2,_2)(x,y,z)<<std::endl;
  49. }
  50. //2.成员函数应用boost::bind
  51. voidtest_bind_fun2()
  52. {
  53. demoa,&ra=a;
  54. demo*p=&a;
  55. //必须在成员函数前加上取地址操作符&,表明这是一个成员函数指针
  56. //第二个参数用structdemo,structdemo*两个类型都可以
  57. std::cout<<boost::bind(&demo::f,a,_1,20)(10)<<std::endl;
  58. std::cout<<boost::bind(&demo::f,ra,_2,_1)(10,20)<<std::endl;
  59. std::cout<<boost::bind(&demo::f,p,_1,_2)(10,20)<<std::endl;
  60. }
  61. //3.成员变量
  62. voidtest_bind_val()
  63. {
  64. typedefstd::pair<int,std::string>pair_t;
  65. pair_tp(123,"string");
  66. std::cout<<boost::bind(&pair_t::first,p)()<<std::endl;
  67. std::cout<<boost::bind(&pair_t::second,p)()<<std::endl;
  68. }
  69. //4.函数对象
  70. voidtest_bind_functor()
  71. {
  72. std::cout<<boost::bind(std::plus<int>(),_1,_2)(10,20)<<std::endl;
  73. std::cout<<boost::bind(std::modulus<int>(),_1,3)(11)<<std::endl;
  74. std::cout<<std::boolalpha<<boost::bind(std::greater<int>(),_1,10)(20)<<std::endl;
  75. std::cout<<boost::bind<int>(sf(),_1,_2)(11,22)<<std::endl;
  76. }
  77. //可以使用ref库包装了对象的引用,可以让bind存储对象引用的拷贝,从而降低了拷贝的代价。
  78. voidtest_bind_ref()
  79. {
  80. //变量
  81. intx=10;
  82. //11+10+10
  83. std::cout<<boost::bind(g,_1,boost::cref(x),boost::ref(x))(11)<<std::endl;
  84. //一个函数对象
  85. sfaf;
  86. std::cout<<boost::bind<int>(boost::ref(af),_1,_2)(11,22)<<std::endl;
  87. }


上文来自:http://blog.csdn.net/huang_xw/article/details/8452785



分享给朋友:
您可能感兴趣的文章:
随机阅读: