// Copyright (c) 2015 // Author: Chrono Law #include <std.hpp> //using namespace std; #include <boost/bind.hpp> using namespace boost; ////////////////////////////////////////// int f(int a, int b)<span style="white-space:pre"> </span>//二元函数 { return a + b;} int g(int a, int b, int c)<span style="white-space:pre"> </span>//三元函数 { return a + b * c;} //typedef int (*f_type)(int, int); //typedef int (*g_type)(int, int, int); typedef decltype(&f) f_type; typedef decltype(&g) g_type; void case1() { std::cout << "case1" << std::endl; std::cout << bind(f,1,2)() << std::endl; std::cout << bind(g,1,2,3)() << std::endl; //f_type fp = f; //std::cout << bind(fp, _1, _2)(1,2) << std::endl; int x = 1, y = 2, z = 3; bind(f, _1, 9)(x) ; bind(f, _1, _2)(x, y) ; bind(f, _2, _1)(x, y) ; bind(f, _1, _1)(x, y) ; bind(g, _1, 8, _2)(x, y) ; bind(g, _3, _2, _2)(x, y, z) ; f_type pf = f; g_type pg = g; std::cout << bind(pf, _1, 9)(x) << std::endl; std::cout << bind(pg, _3, _2, _2)(x, y, z) << std::endl; std::cout << "case1" << std::endl; } ////////////////////////////////////////// struct demo { int f(int a, int b) { return a + b; } }; struct point { int x, y; point(int a = 0, int b = 0):x(a),y(b){} void print() { std::cout << "(" << x << "," << y << ") "; } }; void case2() { std::cout << "case2" << std::endl; demo a,&ra=a; demo *p = &a; std::cout << bind(&demo::f, a, _1, 20)(10) << std::endl; std::cout << bind(&demo::f, ra, _2, _1)(10, 20) << std::endl; std::cout << bind(&demo::f, p, _1, _2)(10, 20) << std::endl; std::vector<point> v(10); std::for_each(v.begin(), v.end(), bind(&point::print, _1)); std::cout << "case2" << std::endl; } ////////////////////////////////////////// void case3() { std::cout << "case3" << std::endl; std::vector<point> v(10); std::vector<int> v2(10); std::transform(v.begin(), v.end(), v2.begin(), bind(&point::x, _1)); for(auto x : v2) //foreach循环输出值 std::cout << x << ","; typedef std::pair<int, std::string> pair_t; pair_t p(123, "string"); std::cout << bind(&pair_t::first , p)() << std::endl; std::cout << bind(&pair_t::second, p)() << std::endl; std::cout << "case3" << std::endl; } ////////////////////////////////////////// struct func { int operator()(int a, int b) { return a + b; } }; void case4() { std::cout << "case4" << std::endl; bind(std::greater<int>(), _1, 10); bind(std::plus<int>(), _1, _2); bind(std::modulus<int>(), _1, 3); std::cout << bind<int>(func(), _1, _2)(10,20) << std::endl; std::cout << "case4" << std::endl; } ////////////////////////////////////////// void case5() { int x = 10; std::cout << bind(g,_1, cref(x), ref(x))(10) << std::endl; func af; std::cout << bind<int>(ref(af), _1, _2)(10, 20) << std::endl; } ////////////////////////////////////////// void case6() { int x = 10; auto r = ref(x); { int *y = new int(20); r = ref(*y); std::cout << r << std::endl; std::cout << bind(g, r, 1, 1)() << std::endl; delete y; } std::cout << bind(g, r, 1, 1)() << std::endl; } ////////////////////////////////////////// #include <boost/rational.hpp> void case7() { typedef rational<int> ri; std::vector<ri> v = {ri(1,2),ri(3,4),ri(5,6)}; std::remove_if(v.begin(), v.end(), bind(&ri::numerator, _1) == 1 ); assert(v[0].numerator() == 3); assert(std::find_if(v.begin(), v.end(), bind(&ri::numerator, _1) == 1) == v.end()); auto pos = std::find_if(v.begin(), v.end(), bind(&ri::numerator, _1) >3 && bind(&ri::denominator, _1) < 8); std::cout << *pos << std::endl; pos = find_if(v.begin(), v.end(), [](ri &r) { return r.numerator() >3 && r.denominator() < 8; }); std::cout << *pos << std::endl; } ////////////////////////////////////////// void case8() { auto lf = [](int x) { return f(x, 9); }; assert(lf(10) == bind(f, _1, 9)(10)); } ////////////////////////////////////////// int f(double a, double b) { return a * b;} typedef int (*f_type1)(int, int); typedef int (*f_type2)(double, double); void case9() { //std::cout << bind(f,1,2)() << std::endl; f_type1 pf1 = f; f_type2 pf2 = f; std::cout << bind(pf1,1,2)() << std::endl; std::cout << bind(pf2,1,2)() << std::endl; } ////////////////////////////////////////// int main() { case1(); case2(); case3(); case4(); case5(); case6(); case7(); case8(); case9(); }
测试运行方法: 将common/std.hpp文件拷贝到/usr/include下即可 编译命令 g++ -g bind.cpp -o bind --std=c++11 ./bind运行可看到结果