zoukankan      html  css  js  c++  java
  • boost::bind实践

    第一部分源码为基础实践:

     1 /*Beyond the C++ Standard Library ( An Introduction to Boost )[CN].chm*/
     2 /*bind的用法*/
     3 
     4 #include <iostream>
     5 #include <algorithm>
     6 #include <functional>
     7 #include <vector>
     8 
     9 #include <boost/bind/bind.hpp>
    10 #include <boost/bind/apply.hpp>
    11 #include <boost/smart_ptr/shared_ptr.hpp>
    12 
    13 using namespace std;
    14 using namespace boost;
    15 
    16 int f(int a, int b)
    17 {
    18     return a + b;
    19 }
    20 
    21 int g(int a, int b, int c)
    22 {
    23     return a + b + c;
    24 }
    25 
    26 bool preFind(int a, int b)
    27 {
    28     return a<b;
    29 }
    30 bool preFind2(int a, int b, int c)
    31 {
    32     return a<b && a<c;
    33 }
    34 struct predicate
    35 {
    36     typedef void result_type;
    37     void operator() (int a, int b)
    38     {
    39         cout << a << "+" << b << "=" << a+b << endl;
    40     }
    41 };
    42 struct X
    43 {
    44     void f(int a)
    45     {
    46         cout << "a = " << a << endl;
    47     }
    48     void f2(int a, int b)
    49     {
    50         cout << a << "+" << b << "=" << a+b << endl;
    51     }
    52     predicate pre;
    53     int arrElem;
    54     int *parrElem;
    55 };
    56 
    57 void main()
    58 {
    59     int arr[5] = {1, 2, 3, 4, 5};
    60     //int ret1 = std::count_if(arr, arr+5, boost::bind(preFind, _1, 2));
    61     //cout << ret1 << endl;
    62     //int ret2 = std::count_if(arr, arr+5, boost::bind(preFind, 2, _2));
    63     //cout << ret2 << endl;
    64     //std::for_each (arr, arr+5, boost::bind(preFind, _1, 2));
    65     //std::for_each (arr, arr+5, boost::bind(predicate(), _1, 2));
    66     //std::for_each (arr, arr+5, boost::bind(boost::type<void>(), predicate(), _1, 2));
    67     //std::for_each (arr, arr+5, boost::bind(preFind2, _1, 2, 3));
    68     //std::for_each (arr, arr+5, boost::bind(preFind2, _1, 2, _1));
    69     //boost::bind(preFind2, 5, _2, 3);
    70     //std::for_each (arr, arr+5, boost::bind(preFind2, 5, _2, 3));
    71 
    72     //boost::bind(preFind, _1, 2);
    73     //boost::bind(preFind, _2, 2);
    74     //boost::bind(preFind, _1, _2);
    75     //boost::bind(preFind, _2, _1);
    76     //boost::bind(preFind2, _1, _2, _3);
    77     //boost::bind(predicate(), _1, _2);
    78     //boost::bind(boost::type<void>(), predicate(), _1, _2);
    79 
    80     //X x;
    81     //boost::bind(&X::f, boost::ref(x), _1);
    82     //boost::bind(&X::f, _1, 1);
    83     //boost::bind(&X::f, _1, _2);
    84     //boost::bind(&X::pre, _1);
    85     //std::for_each (arr, arr+5, boost::bind(&X::f, x, _1));
    86     //std::for_each (arr, arr+5, boost::bind(&X::f2, boost::ref(x), _1, 2));
    87     //std::for_each (arr, arr+5, boost::bind(&X::f2, &x, _1, 2));
    88     //boost::shared_ptr<X> p(new X);
    89     //std::for_each (arr, arr+5, boost::bind(&X::f2, p, _1, 2));
    90     std::vector<X*> arrs;
    91     for (int i=0 ; i!=5 ; ++i)
    92     {
    93         arrs.push_back(new X);
    94     }
    95     std::for_each (arrs.begin(), arrs.end(), boost::bind(&X::arrElem, _1));
    96     std::for_each (arrs.begin(), arrs.end(), boost::bind(&X::f, _1, 2));
    97 }

    第二部分源码为实际应用:

     1 /*Beyond the C++ Standard Library ( An Introduction to Boost )[CN].chm*/
     2 /*bind的用法*/
     3 
     4 #include <iostream>
     5 #include <algorithm>
     6 #include <functional>
     7 #include <vector>
     8 
     9 #include <boost/bind/bind.hpp>
    10 #include <boost/smart_ptr/shared_ptr.hpp>
    11 
    12 using namespace std;
    13 using namespace boost;
    14 
    15 class status 
    16 {  
    17 public:
    18     std::string name_;  
    19     bool ok_;
    20 public:  
    21     status(const std::string& name):name_(name),ok_(true) {}  
    22     void break_it() {    ok_=false;  }  
    23     bool is_broken() const {    return ok_;  }  
    24     void report() const 
    25     {    
    26         std::cout << name_.c_str() << " is " << (ok_ ? "working nominally":"terribly broken") << std::endl;  
    27     }
    28 };
    29 
    30 void nine_arguments(  int i1,int i2,int i3,int i4,  int i5,int i6,int i7,int i8, int i9)
    31 {  
    32     std::cout << i1 << i2 << i3 << i4 << i5 << i6 << i7 << i8 << i9 << '
    ';
    33 }
    34 int main() 
    35 {  
    36     int i1=1,i2=2,i3=3,i4=4,i5=5,i6=6,i7=7,i8=8,i9=9;  
    37     (boost::bind(&nine_arguments,_9,_2,_1,_6,_3,_8,_4,_5,_7))(i1,i2,i3,i4,i5,i6,i7,i8,i9);
    38 
    39 
    40     //std::vector<status> statuses;
    41     //statuses.push_back(status("status 1"));
    42     //statuses.push_back(status("status 2"));
    43     //statuses.push_back(status("status 3"));
    44     //statuses.push_back(status("status 4"));
    45     //statuses[1].break_it();
    46     //statuses[2].break_it();
    47     ////method 1:
    48     //for (std::vector<status>::iterator it=statuses.begin();  it!=statuses.end();++it) 
    49     //{  
    50     //    it->report();
    51     //}
    52     ////method 2: ok
    53     //std::for_each(  statuses.begin(),  statuses.end(),  std::mem_fun_ref(&status::report));
    54     ////method 3: ok
    55     //std::for_each(  statuses.begin(),  statuses.end(),  boost::bind(&status::report, _1));
    56     ////others ok
    57     //std::for_each(  statuses.begin(),  statuses.end(),  boost::bind(&status::name_, _1));
    58 
    59     //std::vector<status*> p_statuses;
    60     //p_statuses.push_back(new status("status 1"));
    61     //p_statuses.push_back(new status("status 2"));
    62     //p_statuses.push_back(new status("status 3"));
    63     //p_statuses.push_back(new status("status 4"));
    64     //p_statuses[1]->break_it();
    65     //p_statuses[2]->break_it();
    66     ////method 2: ok
    67     //std::for_each(  p_statuses.begin(),  p_statuses.end(),  std::mem_fun(&status::report));
    68     ////method 3: ok
    69     //std::for_each(  p_statuses.begin(),  p_statuses.end(),  boost::bind(&status::report, _1));
    70 
    71     std::vector<boost::shared_ptr<status> > s_statuses;
    72     s_statuses.push_back(  boost::shared_ptr<status>(new status("status 1")));
    73     s_statuses.push_back(  boost::shared_ptr<status>(new status("status 2")));
    74     s_statuses.push_back(  boost::shared_ptr<status>(new status("status 3")));
    75     s_statuses.push_back(  boost::shared_ptr<status>(new status("status 4")));
    76     s_statuses[1]->break_it();
    77     s_statuses[2]->break_it();
    78     //method 2: error
    79     //std::for_each(  s_statuses.begin(),  s_statuses.end(),  std::mem_fun(&status::report));
    80     //method 3: ok
    81     std::for_each(  s_statuses.begin(),  s_statuses.end(),  boost::bind(&status::report, _1));
    82 
    83 
    84 }
    煮酒论英雄
  • 相关阅读:
    Day2 while 循环,格式化输出,运算符,字符串编码
    Day 1 变量,基础数据类型与条件语句
    关于字符的一些看法
    正则的全局问题
    模块——js功能(倒计时,幻灯)
    垂直居中
    不确定宽度元素居中
    css3媒体查询
    less的预处理
    手机幻灯
  • 原文地址:https://www.cnblogs.com/superstargg/p/3714019.html
Copyright © 2011-2022 走看看