首页 > 代码库 > boost::bind实践2——来自《Beyond the C++ Standard Library ( An Introduction to Boost )》
boost::bind实践2——来自《Beyond the C++ Standard Library ( An Introduction to Boost )》
直接代码:
代码段1:
1 #include <iostream> 2 #include <string> 3 #include <boost/bind/bind.hpp> 4 5 class some_class 6 { 7 public: 8 typedef void result_type; 9 void print_string(const std::string& s) const 10 { std::cout << s << ‘\n‘; } 11 }; 12 void print_string(const std::string s) 13 { 14 std::cout << s << ‘\n‘; 15 } 16 int main() 17 { 18 boost::bind(&print_string,_1)("Hello func!"); //ok 19 some_class sc; 20 boost::bind(&some_class::print_string,_1,_2)(sc,"Hello member!"); //ok 21 boost::bind(&some_class::print_string,_1,_2)(some_class(),"Hello member!"); //ok 22 boost::bind(&some_class::print_string,some_class(),"Hello member!")(); //ok 23 boost::bind(&some_class::print_string,some_class(),"Hello member!"); //warning 24 std::cout << std::endl; 25 }
代码段2:
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <algorithm> 5 #include <iterator> 6 #include <list> 7 8 #include <boost/bind/bind.hpp> 9 10 class personal_info 11 { 12 friend std::ostream& operator<< ( std::ostream& os,const personal_info& pi); 13 14 std::string name_; 15 std::string surname_; 16 unsigned int age_; 17 public: 18 personal_info( const std::string& n, const std::string& s, unsigned int age):name_(n),surname_(s),age_(age) {} 19 std::string name() const { return name_; } 20 std::string surname() const { return surname_; } 21 unsigned int age() const { return age_; } 22 }; 23 std::ostream& operator<<( std::ostream& os,const personal_info& pi) 24 { 25 os << pi.name() << ‘ ‘ << pi.surname() << ‘ ‘ << pi.age() << ‘\n‘; 26 return os; 27 } 28 class personal_info_age_less_than : public std::binary_function< personal_info,personal_info,bool> 29 { 30 public: 31 bool operator()( const personal_info& p1,const personal_info& p2) 32 { 33 return p1.age()<p2.age(); 34 } 35 }; 36 37 void main() 38 { 39 std::vector<personal_info> vec; 40 vec.push_back(personal_info("Little","John",30)); 41 vec.push_back(personal_info("Friar", "Tuck",50)); 42 vec.push_back(personal_info("Robin", "Hood",40)); 43 std::sort( vec.begin(), vec.end(), 44 boost::bind( std::less<unsigned int>(), 45 boost::bind(&personal_info::age,_1), 46 boost::bind(&personal_info::age,_2))); 47 48 std::sort(vec.begin(),vec.end(),personal_info_age_less_than()); 49 50 std::vector<int> ints; 51 ints.push_back(7); 52 ints.push_back(4); 53 ints.push_back(12); 54 ints.push_back(10); 55 //if (i>5 && i<=10) { // Do something} 56 int count=std::count_if( ints.begin(), 57 ints.end(), 58 boost::bind( std::logical_and<bool>(), 59 boost::bind(std::greater<int>(),_1,5), 60 boost::bind(std::less_equal<int>(),_1,10))); 61 std::cout << count << ‘\n‘; 62 std::vector<int>::iterator int_it=std::find_if( ints.begin(), 63 ints.end(), 64 boost::bind( std::logical_and<bool>(), 65 boost::bind(std::greater<int>(),_1,5), 66 boost::bind(std::less_equal<int>(),_1,10))); 67 if (int_it!=ints.end()) 68 { 69 std::cout << *int_it << ‘\n‘; 70 } 71 72 std::list<double> values; 73 values.push_back(10.0); 74 values.push_back(100.0); 75 values.push_back(1000.0); 76 //以下语句全部等价 77 std::transform( values.begin(), values.end(), values.begin(), boost::bind( std::multiplies<double>(),0.90, boost::bind<double>( std::multiplies<double>(),_1,1.10))); 78 std::transform( values.begin(), values.end(), values.begin(), boost::bind( std::multiplies<double>(),0.90, boost::bind( std::multiplies<double>(),_1,1.10))); 79 std::transform( values.begin(), values.end(), values.begin(), boost::bind( std::multiplies<double>(),0.90, boost::bind( boost::type<double>(), std::multiplies<double>(),_1,1.10))); 80 std::transform( values.begin(), values.end(), values.begin(), boost::bind<double>( std::multiplies<double>(), boost::bind<double>( std::multiplies<double>(),_1,1.10),0.90)); 81 82 std::copy( values.begin(), 83 values.end(), 84 std::ostream_iterator<double>(std::cout,"\n")); 85 86 }
代码段3:
1 #include <iostream> 2 #include <string> 3 4 #include <boost/bind/bind.hpp> 5 6 class tracer 7 { 8 public: 9 tracer() { std::cout << "tracer::tracer()\n"; } 10 tracer(const tracer& other) { std::cout << "tracer::tracer(const tracer& other)\n"; } 11 tracer& operator=(const tracer& other) { std::cout << "tracer& tracer::operator=(const tracer& other)\n"; return *this; } 12 ~tracer() { std::cout << "tracer::~tracer()\n"; } 13 void print(const std::string& s) const { std::cout << s << ‘\n‘; } 14 }; 15 16 void main() 17 { 18 tracer t; 19 //boost::bind(&tracer::print, t, _1)(std::string("I‘m called on a copy of t\n")); 20 //boost::bind(&tracer::print, &t, _1)(std::string("I‘m called on a copy of t\n")); 21 //boost::bind(&tracer::print, boost::ref(t), _1)(std::string("I‘m called on a copy of t\n")); 22 //boost::bind(&tracer::print, boost::cref(t), _1)(std::string("I‘m called on a copy of t\n")); 23 boost::bind(&tracer::print, _1, _2)(&t, std::string("I‘m called on a copy of t\n")); 24 }
代码段4:
1 #include <iostream> 2 #include <string> 3 #include <map> 4 #include <algorithm> 5 #include <iterator> 6 7 #include <boost/bind/bind.hpp> 8 9 void print_string(const std::string& s) { std::cout << s << ‘\n‘;} 10 void print_string2(const std::map<int,std::string>::value_type& s) { std::cout << s.second << ‘\n‘;} 11 void print_string3(const int& i) { std::cout << i << ‘\n‘;} 12 13 void main() 14 { 15 std::map<int,std::string> my_map; 16 my_map[0]="Boost"; 17 my_map[1]="Bind"; 18 19 std::for_each( my_map.begin(), 20 my_map.end(), 21 boost::bind(&print_string, 22 boost::bind( &std::map<int,std::string>::value_type::second,_1))); 23 std::for_each( my_map.begin(), 24 my_map.end(), 25 boost::bind(&print_string2, _1)); 26 std::for_each( my_map.begin(), 27 my_map.end(), 28 boost::bind(&print_string3, 29 boost::bind( &std::map<int,std::string>::value_type::first,_1))); 30 //std::for_each( my_map.begin(), 31 // my_map.end(), 32 // boost::bind(&print_string, _1)(&std::map<int,std::string>::value_type::second)); //error 33 34 }
代码段5:
1 #include <iostream> 2 #include <string> 3 #include <map> 4 #include <vector> 5 #include <algorithm> 6 7 #include <boost/bind/bind.hpp> 8 9 class print_size 10 { 11 typedef std::map<std::string,std::vector<int> > map_type; 12 public: 13 typedef void result_type; 14 result_type operator()(std::ostream& os, const map_type::value_type& x) const 15 { 16 os << x.second.size() << ‘\n‘; 17 } 18 result_type operator()(std::ostream& os, const map_type& x) const //no use 19 { 20 map_type::const_iterator iter = x.begin(); 21 os << iter->second.size() << ‘\n‘; 22 } 23 }; 24 25 int main() 26 { 27 typedef std::map<std::string,std::vector<int> > map_type; 28 map_type m; 29 m["Strange?"].push_back(1); 30 m["Strange?"].push_back(2); 31 m["Strange?"].push_back(3); 32 m["Weird?"].push_back(4); 33 m["Weird?"].push_back(5); 34 std::for_each(m.begin(),m.end(), boost::bind(print_size(),boost::ref(std::cout),_1)); 35 }
以上代码段全部通过VS2010 update1编译运行。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。