boost::bind介紹
bind的中文翻譯是"綁定",它的作用就是把參數(shù)與象函數(shù)一樣的"東西"進(jìn)行"綁定",然后象
函數(shù)一樣運(yùn)行.那象函數(shù)一樣的"東西"到底是什么東西呢?
象函數(shù)一樣的"東西"還挺多的.
int f1();
free function,這當(dāng)然是一種.
int C::method();
某個(gè)class的method,當(dāng)然也是一種.
typedef int (*pfunc)();
pfunc = f1;
函數(shù)指針,也是一種.
class C
{
public:
void operator()();
};
C obj;
obj(); //這是什么?看上去象函數(shù)調(diào)用.
//它等于 obj.()() --- 如此怪異的東西
//第一個(gè)()是函數(shù)名稱,第二個(gè)()才是函數(shù)調(diào)用符
上面的class C有個(gè)標(biāo)準(zhǔn)名稱,functor.自然它也屬于象函數(shù)一樣的"東西".
大概就這么點(diǎn)了吧,其他的反正現(xiàn)在是想不起來(lái)了,或許boost::function實(shí)現(xiàn)的"委托"也算一種
(不敢肯定,還沒(méi)研究).
下面看看bind是怎樣把參數(shù)依次與各個(gè)象函數(shù)一樣的"東西""綁定"的.
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(占位符),會(huì)被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, 所以通過(guò)reference可能更有效率.默認(rèn)情況下boost::bind的參數(shù)都是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), 效率沒(méi)有上一行代碼高
bind(&X::f, &x, _1)(i); //(&x)->f(i),索性傳指針
bind(&X::f, p, _1)(i); //p是smart pointer object,所以也有copy動(dòng)作
//p_copy = p, p_copy->f(i)
bind(&X::f, boost::ref(p), _1)(i); //比上面一行,高效一點(diǎn)
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的返回值呢?