Boost库之function的使用



Boost库的function是一组函数对象包装类的模板,实现了一个泛型的回调机制。Boost库的function与函数指针相比,优点在于它允许用户在目标的实现上拥有更大的弹性,即目标既可以是普通函数(自由函数),也可以是函数对象和类成员函数,而且可以给函数添加状态。

使用Boost库的function,可以很好地与现有的代码融合在一起。另外,function还可以与Boost库的bind和lambda配合使用,从而极大地扩展了function的适用范围。function库支持的函数参数个数最多为10个,其头文件为function.hpp或functionX.hpp(其中,X为0到10之间的整数)。如果你的程序中只使用了X个参数的function,那么你可以只包含对应的functionX.hpp,当然,你也可以只包含function.hpp(它包含了所有的functionX.hpp)。

下面介绍function库的具体用法。

◆    普通函数(自由函数)用法

int Add(int x, int y)

{

return x+y;

}

function<int (int,int)> f;            // 或者  function2<int, int, int> f;

f = Add;

cout << "f(2, 3)=" << f(2, 3) << endl;

其中,模板参数的第1个int为返回值类型,后两个int为参数类型。

◆    函数对象用法

class CStudent

{

public:

void operator() (string strName, int nAge)

{

cout << strName << " : " << nAge << endl;

}

};

function<void (string, int)> f;        // 或者  function2<void, string, int> f;

CStudent stu;

f = stu;

cout << "f(\"hello\", 25)=" << f("hujian", 25) << endl;

◆    成员函数用法

struct TAdd

{

int Add(int x,int y)

{

return x+y;

}

};

TAdd tAdd;

function<int  (tAdd *,int,int)> f;        // 或者  function<int  (tAdd &,int,int)> f;

f = & TAdd::Add;

cout << f(&tAdd, 2, 3);   // 如果前面的模板参数为值或引用,直接传入tAdd即可

其中,模板参数的tAdd *为类的实例的指针,当然也可以传入类的实例或其引用,只不过调用时需要做相应的修改。

使用function时,可以通过empty函数或与0比较来判断其是否指向一个有效的函数。如果function没有指向一个有效的函数,调用时会抛出bad_function_call的异常。function的clear函数可以使其不再关联到一个函数或函数对象,如果该function本身就是空的,调用该函数也不会带来任何问题。

转载    http://www.cnblogs.com/hujian/archive/2009/06/04/1495813.html

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

时间: 2024-08-30 16:33:37

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

boost库之function

// FirstTest.cpp : 定义控制台应用程序的入口点. //function<type> 存放方法的地址,函数的包装器(function wrapper) //*iterator1 内容为参数传入function #include "stdafx.h" #include <boost/function.hpp> #include <string> #include <iostream> using namespace std;

在win7 + vs express for desktop中安装stlport和boost库

一.安装stlport stlport是将sgi的stl库平移到各个平台上.sgi的这个库的特点就是效率非常高.boost在这个库上面运行要比vs自带的stl库效率高.所以我们首选安装stlport. 下载stlport:http://sourceforge.net/projects/stlport/ 最新版本是5.2.1 放到C盘根目录下面,解压.进入"vs2012 x86 native tools command prompt".(注意:用cmd不行) 进入"C:\STL

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

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

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

2015-03-12---外观模式,建造者模式,观察者模式,boost库应用

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

Boost库之lambda的使用

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

所有的 Boost 库文档的索引

按字母顺序列出的库 按类别列出的库 算法 破碎的编译器的解决方法 并发编程 容器 正确性和测试 数据结构 特定于域的 函数对象和高阶编程 泛型编程 图像处理 输入/输出 跨语言支持 迭代器 语言功能仿真 数学和数字 内存 解析 模式和习语 预处理器元编程 编程接口 状态机 字符串和文本处理 系统 模板元编程 杂项 图书馆从提高退休 请参阅入门页面以了解如何下载. 构建和安装库. 按字母顺序列出的库 蓄能器-增量计算和统计累加器,Eric Niebler 从集合框架 算法-有用的通用算法,从马歇尔

C++ Boost库分类总结

c# 程序员写c++,各种不适应.尤其是被内存操作和几十种字符串类型的转换,简直疯了,大小写转换竟然要手动写代码实现. Boost看介绍不错,也不知道能不能跨平台.过几天要上linux写c++, 也不知道这东西能不能用. 转自: https://blog.csdn.net/svap1/article/details/80496489 按照实现的功能,Boost可为大致归入以下20个分类,在下面的分类中,有些库同时归入几种类别.字符串和文本处理库 a) Conversion库:对C++类型转换的增

使用boost库完成读写JSON字符串

boost库的编译不做赘述,这里用的版本是1.69.0,其他版本应该差不多 boost官网:https://www.boost.org/ 0.前言 今天要整的JSON是这样的 { "description": "this is a JSON test", "version": "100", "list": { "listkey1": "listvalue1", &qu