boost::bind介紹
bind的中文翻譯是"綁定",它的作用就是把參數與象函數一樣的"東西"進行"綁定",然后象
函數一樣運行.那象函數一樣的"東西"到底是什么東西呢?
象函數一樣的"東西"還挺多的.
int f1();
free function,這當然是一種.
int C::method();
某個class的method,當然也是一種.
typedef int (*pfunc)();
pfunc = f1;
函數指針,也是一種.
class C
{
public:
void operator()();
};
C obj;
obj(); //這是什么?看上去象函數調用.
//它等于 obj.()() --- 如此怪異的東西
//第一個()是函數名稱,第二個()才是函數調用符
上面的class C有個標準名稱,functor.自然它也屬于象函數一樣的"東西".
大概就這么點了吧,其他的反正現在是想不起來了,或許boost::function實現的"委托"也算一種
(不敢肯定,還沒研究).
下面看看bind是怎樣把參數依次與各個象函數一樣的"東西""綁定"的.
1. bind free function
int add(int x, int y)
{
return x + y;
}
add(1, 2) <===> boost::bind(add, 1, 2)
int add1(int x)
{ <===> boost::bind(add, _1, 1)(x);
return add(x, 1); 其中 _1 是placehold(占位符),會被x所取代
}
add(x, y) <===> boost::bind(add, _1, _2)(x, y);
<===> boost::bind(add, _2, _1)(y, x);
add(x, x) <===> boost::bind(add, _1, _1)(x, y)
<===> boost::bind(add, _2, _2)(y, x)
C Add(const C &objX, cinst C &objY)
<===> boost::bind(Add, boost::cref(_1), boost::cref(_2))(objX, objY)
由于是非buildin type, 所以通過reference可能更有效率.默認情況下boost::bind的參數都是copy一份,不是很
有效率.
2. bind functor
struct F
{
int operator()(int a, int b) { return a - b; }
bool operator()(long a, long b) { return a == b; }
};
F f;
int x = 104;
bind<int>(f, _1, _1)(x); // f(x, x), i.e. zero
bind<int>(F(), _1, _1)(x); //F()是匿名object
3. bind class method
struct X
{
bool f(int a);
};
X x;
shared_ptr<X> p(new X);
int i = 5;
bind(&X::f, boost::ref(x), _1)(i); //x.f(i)
bind(&X::f, x, _1)(i); //x_copy = x, x_copy.f(i), 效率沒有上一行代碼高
bind(&X::f, &x, _1)(i); //(&x)->f(i),索性傳指針
bind(&X::f, p, _1)(i); //p是smart pointer object,所以也有copy動作
//p_copy = p, p_copy->f(i)
bind(&X::f, boost::ref(p), _1)(i); //比上面一行,高效一點
4. Misc.
add(add(1, 2), add(3, 4) <===> boost::bind(add, boost::bind(add, 1, 2), boost::bind(add, 3, 4))
boost::bind支持嵌套
bind的返回值呢?