Boost库之bind的使用



Boost库的bind是对STL的bind1st和bind2nd的进一步泛化,那么我们不免要问,bind相对于bind1st和bind2nd,都有哪些优点呢?下面通过一个具体的例子来说明这个问题。

假如有一个整数的容器vector,现在想找出容器中不大于10的元素的个数,那么我们可以有多种方式来实现:

1.    自由函数方式

BOOL LessEqualToTen(int nTemp)

{

return nTemp <= 10;

}

int nCount = count_if(vctTemp.begin(), vctTemp.end(), LessEqualToTen);

2.    函数对象方式

struct TLessEqualToTen

{

BOOL operator()(int nTemp)

{

return nTemp <= 10;

}

}

int nCount = count_if(vctTemp.begin(), vctTemp.end(), TLessEqualToTen());

3.    以上两种方式都比较麻烦,需要编写单独的函数,而bind1st或bind2nd方式则显得比较简洁

int nCount = count_if(vctTemp.begin(), vctTemp.end(), bind2nd(less_equal<int>(), 10));

或者

int nCount = count_if(vctTemp.begin(), vctTemp.end(), not1(bind2nd(greater<int>(), 10)));

4.    bind方式

int nCount = count_if(vctTemp.begin(), vctTemp.end(), bind(less_equal<int>(), _1,10));

通过比较以上4种实现方式我们可以发现,前两种在语法上稍显繁琐,而后两种则显得比较简洁,尤其是最后一种方式,由于使用了占位符,比较符合人的逻辑思维习惯。但单就以上的比较,还不足以看出bind的优势所在。那么,现在让我们找出容器中大于5但小于10的元素的个数,怎么办?采用第3种方式已经无法实现了,前两种方式倒是可以实现,但缺点显而易见,语法太不简练了。让我们试试采用bind如何来实现。

int nCount = count_if(vctTemp.begin(), vctTemp.end(), bind(logical_and<bool>(), bind(greater<int>(), _1, 5), bind(less<int>(), _1, 10));

可以看到,由于bind支持嵌套使用,因此在语法上显得非常的简洁。但bind提供的功能远不止这些,它还提供了对自由函数、函数对象、成员函数、成员变量以及虚函数的调用的支持,并且采用了完全一致的语法。如果没有bind,那么我们对所有这些不同类型函数的调用方式将显得非常不一致甚至是凌乱,总结如下。

1.    bind1st和bind2nd不支持对自由函数的直接绑定,如果要绑定自由函数,则需要先使用ptr_fun将自由函数转换为一个函数对象(从binary_function派生)。

2.    转换成员函数为函数对象时,需要考虑传递的是指针还是对象,如果是指针,使用mem_fun,如果是对象,则需要使用mem_fun_ref。另外,mem_fun不支持智能指针。

3.    如果成员函数没有参数,转换为函数对象使用mem_fun或mem_fun_ref;如果成员函数有1个参数,则需要使用mem_fun1或mem_fun1_ref;如果成员函数有2个或2个以上的参数,那么,对不起,mem_fun系列函数将无能为力。

4.    mem_fun和mem_fun_ref不支持对成员变量的转换。

转载     http://www.cnblogs.com/hujian/archive/2009/06/13/1502445.html

如有版权问题,请联系QQ:    858668791

时间: 2024-11-06 09:52:15

Boost库之bind的使用的相关文章

boost库之bind(与function配合使用)

// FirstTest.cpp : 定义控制台应用程序的入口点. //bind(&mem,&obj, _1):类成员方法地址,对象地址,_1是占位符 //同一个类的不同对象可以delegate给不同的实现,从而实现不同的行为(myan语) #include "stdafx.h" #include <boost/function.hpp> #include <boost/bind.hpp> #include <string> #inc

Boost库之function的使用

 Boost库的function是一组函数对象包装类的模板,实现了一个泛型的回调机制.Boost库的function与函数指针相比,优点在于它允许用户在目标的实现上拥有更大的弹性,即目标既可以是普通函数(自由函数),也可以是函数对象和类成员函数,而且可以给函数添加状态. 使用Boost库的function,可以很好地与现有的代码融合在一起.另外,function还可以与Boost库的bind和lambda配合使用,从而极大地扩展了function的适用范围.function库支持的函数参数个

Boost库之lambda的使用

 在C++引入Boost库的lambda之前,许多编程语言,比如Lisp.Python和C#中就已经有了lambda.Boost库创建lambda的最初动机,是为了解决使用标准库时存在大量小的函数对象的定义的问题.而实际上,我们完全可以在需要使用这些函数对象的时候进行声明和定义,即就地进行.lambda库通过创建一个匿名的lambda表达式来代替实名的函数对象,大大简化了标准库的语法. 下面我们来看一个hello world级的lambda表达式: (cout << _1 <<

C++11和Boost库

C++11标准中引入了很多Boost库中的东西,对于所有人来说,完全可以使用C++11来替代之前使用的boost库. 但是还有一些事项需要我们注意. 发现了一篇好文,出处: https://meetingcpp.com/index.php/br/items/c11-and-boost.html Some parts of the Standard Library in C++11 are predated in boost. When playing around with C++11, you

boost库在工作(15)绑定器与函数对象之三

前面已经可以优美地解决两个参数的函数给算法for_each调用了,但是又会遇到这样的一种情况,当需要三个参数或者三个以上的参数给算法for_each调用呢?从STL里的绑定器bind1st,显然是不行了,因为它最多只支持两个参数,那还有什么办法呢?这时就需要使用boost库里强大的绑定器bind了.它不仅适用的情况比STL库里的多,还更加方便,更加人性化.下面就来看看怎么样绑定三个参数的类成员函数的例子,如下: [cpp] view plaincopy //调用类的成员函数,但参数两个以上. /

boost库----share_from_this类的作用和实现原理

使用boost库时,经常会看到如下的类 class A:public enable_share_from_this<A> 在什么情况下要使类A继承enable_share_from_this? 使用场合:当类A被share_ptr管理,且在类A的成员函数里需要把当前类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr. 我们就使类A继承enable_share_from_this,然后通过其成员函数share_from_this()返回当指向自身的share_ptr. 以上

boost库share_from_this类的作用和实现原理

使用boost库时,经常会看到如下的类 class A:public enable_share_from_this<A> 在什么情况下要使类A继承enable_share_from_this? 使用场合 :当类A被share_ptr管理,且在类A的成员函数里需要把 当前类对象作为参数传给其他函数时,就需要传递一个指向自身的share_ptr. 我们就使类A继承enable_share_from_this,然后通过其成员函数 share_from_this()返回当指向自身的share_ptr.

2015-03-12---外观模式,建造者模式(附代码),观察者模式(附代码),boost库应用

今天白天主要看了boost库的应用,主要是经常使用的一些库,array,bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模式.主要就是外观模式.建造者模式和观察者模式.我们从boost简要说起. 事实上boost的库好多东西在c++11里面已经有了.比方bind,仅仅只是boost的库的bind比c++11用着感觉要方便.事实上有些东西我自己由于也没实用c++做过什么大的项目.所以不敢乱说,仅仅敢说点建议性的,关于bi

《超越C++标准库:Boost库导引》:序

序(Foreword) C++社区正在发生着一些美妙的事情.尽管C++仍然是世界上使用最广泛的编程语言,它依旧在变得更加强大而且易用.不信么?容我慢慢道来. 当前版本的标准C++是在1998年最终确定下来的,它为传统的过程式编程(procedural programming)以及面向对象和泛型编程(generic programming)提供了强有力的支持.正如老的(1998年以前的)C++单枪匹马地把面向对象引入软件开发者日常工作可及的范围那样,C++98针对泛型编程做了同样的事情.1990年