Bind 库
前两天才研究了一下STL的函数适配器,煞费苦心的写了一大篇翻译,结果,现在我不得不面对,适配器那套已经过时了。哦,技术就是发展得如此之快。
Bind 库如何改进程序?它使用一致语法,更强大的推断机制。比起STL中那些冗长的适配器,bind相当优雅。
Bind 的实现包括许多函数和类,但作为用户来说,我们不直接使用除了重载函数 bind 以外的任何东西。所有绑定通过 bind 函数发生,我们可以无须依赖于返回值的类型。使用 bind 时,参数占位符(命名为 _1, _2, 等等)不需要用一个using声明或using指示来引入,因为它们位于匿名名字空间。这样,在使用 Boost.Bind时,没有理由写出以下的代码。
using boost::bind;
using namespace boost;
占位符和参数
bind为函数和函数对象提供了一致的语法,对于值语义和指针语义也一样。占位符表示提供给结果函数对象的参数,(目前支持最多9个, _1, _2, … ,_9)。_1 代表它所在的位置会被第一个参数所替代。比如
bind(&fun, _2, 6)( 2, 5); // 等同与 fun(5, 6)
参数的传递是通过传值的方式进行的,在内部有一个参数的拷贝。可以通过传引用的方式。boost::ref 和 boost::cref可以让函数对象存储一个引用而不是拷贝:
struct X {
void fun(int i) { cout<
}
X x;
bind(&X::fun, ref(x), _1) (20);
(在成员函数的定义中,编译器自动提供第一个参数,用以存放this指针,所以fun事实上有两个参数)
和函数对象一起使用
希望你还没有忘记函数对象是什么。示例:
bind (std::greater( ), 2, 8) ( ); //hoo,返回false
bind (F)( ); // F是函数对象,这里不要加&
重载操作符
理解bind的重载操作符的一个重要观点是:在bind对象使用操作符后,它返回的仍然是一个bind对象。例如:
remove_if ( first, lase, !bind(less( ), _1, 10));
find_if( first, last, bind(&X::name, _1) == “Peter” || bind(&X::name, _1) == “Kate”);
std::sort( first, last, bind( &X::name, _1 ) < bind( &X::name, _2 ) ); // sort by name
有趣的是可以和占位符比较
bind( &fun, _1) == _2; // 我一直没办法用它声明一个实例!恐怕只有用在算法中了
bind库小结
bind是迄今为止,我最满意也是使用最多的库,尽管我在这里没有写出大量的篇幅(一种解释是熟悉后就不用写那么详细了)。我目前所有涉及
的程序中,已经迁移到bind了,有时知识就是这样快如闪电地更新着。
阅读(3970) | 评论(0) | 转发(1) |