bi-bind超小型的bind庫
boost中有一個bind庫, 可以說是一個最為實用的tools了, 但是它與boost結合的有些緊密,而且其中的一些功能并不是很常用,就算將它bcp出獨立的庫也是一個不小的負擔。如果在你的項目中不打算有boost庫的痕跡但是又想使用bind的強大功能,那就來看看它吧。
一個一個超小型的bind庫, 它實現(xiàn)了大部分boost::bind的功能, 只是將名字空間由boost 變換為 bi 。如果使用了一般的使用中通??梢詫?
boost::bind(my_fun(), _1,_2)(234, "hello world"); 形式替換為 bi::bind(my_fun(), _1, _2)(234, "hello world"),
既可完成編譯,如果使用了名字空間,那就只需要將 using namespace boost 替換為 using namespafce bi 即可完成轉化。
它對一般函數(shù)、成員函數(shù), 虛擬函數(shù), 函數(shù)對象都提供了全面支持。
但是....
bi::bind沒有打算支持boost庫, 如果在你的項目中使用了其它的boost‘tools,那你就不需要它了(或許也可以拿來研究研究),既然使用了boost,就不在乎在使用boost::bind了,所以boost::bind中涉及到與其它boost庫的有交集的功能bi::bind庫都沒有支持。
它自然支持 boost::shared_ptr, 同時對c++10 保標準的shared_ptr也有很好的支持。
bi::bind借鑒了boost::bind的一些思想,有些代碼甚至是直接從bind.hpp中復制過來的,但它在犧牲一些擴展性和多平臺支持性的后果下, 同樣的代碼比boost::bind中有40%的效率提升 。
bi-bind 同時提供了 callback功能, 它就像是一個簡化版本的 boost::function, 對一次調用行為做了抽象。
例如:
int fun1(int p2)
{
std::cout << "call fun1" << std::endl;
return p2 * p2;
}
struct fun2
{
fun2(int p1)
{
p_ = p1;
}
int operator()(int p2) const
{
return p2 * p_;
}
int p_;
};
//綁定一般函數(shù) 構造 callback
bi::callback cb = bi::bind(&fun1, _1);
int r = cb(2); //r=4,使用了實際參數(shù)2
//綁定仿函數(shù)對象賦值給callback
cb = bi::bind(fun2(2), 9);
r = cb(100); //r=18,使用了綁定參數(shù)9 bind 通常都接收它們的參數(shù)的拷貝, 并會在bind_t對像中保存一份相同的對象,而有些對像不具備拷貝語義或是拷貝的代價很大。 為了解決這個問題對,bind對像的可以使用ref 方式將這個對像封裝起來使用。它定義了類模板 reference_wrapper和 兩個返回實例的函數(shù) ref 和 cref。
reference_wrapper 的目的是容納一個引向類型為 T 的對象的引用。它主要用于把引用傳給bind_t對像, bint_t對像中有對此的重載,即可以解開引用,調用實際的對像。
struct fun2
{
fun2(int p1)
{
p_ = p1;
}
int operator()(int p2) const
{
return p2 * p_;
}
int p_;
};
//假設fun2的拷貝復制的負擔很大
fun2 f(23);
//使用bi::ref解除對f對像的值語義調用
bi::bind(bi::ref(f), 9)(2);