[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; }