关于boost::function与boost::bind函数的使用心得
最近开始写一个线程池,期间想用一个通用的函数模板来使得各个线程执行不同的任务,找到了Boost库中的function函数。
Boost::function是一个函数包装器,也即一个函数模板,可以用来代替拥有相同返回类型,相同参数类型,以及相同参数个数的各个不同的函数。
#include<boost/function.hpp>
#include<iostream>
typedef boost::function<int(int ,char)> Func; int test(int num,char sign)
{
std::cout<<num<<sign<<std::endl
} int main()
{
Func f;
f=&test; //or f=test
f(1,'A');
}
这样在不同的地方用不同的函数来替代 f 可以得到类似于C++中多态的效果。
但是这样有一定的局限性,例如我想实现的线程池需要执行不同的任务,这些任务的返回类型,函数参数个数,参数类型肯定是不同的,所以不能用上面的方法实现,那么怎么样定义一个函数模板来包含各种返回类型,函数参数个数,参数类型不同的各种函数呢?
我们可以定义如下的类型
typedef boost::function<void()> Func;
//or
typedef boost::function<void(void)> Func;
void 类型(空类型)其实是C中四种数据类型之一,其余三个为基本类型,构造类型,指针型。
空类型主要是用来修饰返回类型与函数参数的,不能用了定义变量,void i 是错误的。
可以这样认为空类型是一个抽象的基类,不能用了定义变量,但是它可以表示所有的类型,这样也不难理解,void* 指针能够不用强制转换成不同类型的指针了。
void类型的返回类型表示我们可以返回各种不同的类型了,那我们怎么样传入参数呢?可以用boost::bind。
#include<boost/function.hpp>
#include<boost/bind.hpp>
#include<iostream>
typdef boost::function<void(void)> Func; int test(int num)
{
std::cout<<"In test"<<std::endl;
} int main()
{
Func f(boost::bind<test,>);
f();
}
使用bind来传入各个参数,形成一个通用的函数模板。
不过由于f()的返回值是void类型,所以我们不能有以下写法:
int result=f();
//or
std::cout<<f()<<std<<endl;
不过没有关系,我们可以从参数中传出结果。
关于boost::function与boost::bind函数的使用心得的更多相关文章
- 以boost::function和boost:bind取代虚函数
转自:http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不 ...
- boost::function和boost:bind取代虚函数
以boost::function和boost:bind取代虚函数 这是一篇比较情绪化的blog,中心思想是"继承就像一条贼船,上去就下不来了",而借助boost::function ...
- boost::function 通过boost::bind调用类成员函数
1. 首先引用boost::function和boost::bind的头文件和库: #include "boost/bind.hpp" #include "boost/f ...
- [置顶] 编程模仿boost::function和boost::bind
boost::function和boost::bind结合使用是非常强大的,他可以将成员函数和非成员函数绑定对一个对象上,实现了类似C#的委托机制.委托在许多时候可以替代C++里面的继承,实现对象解耦 ...
- boost::function和boost::bind 介绍
一. boost::function介绍 原文:http://www.cnblogs.com/sld666666/archive/2010/12/16/1907591.html 本片文章主要介绍boo ...
- C++11之function模板和bind函数适配器
在C++98中,可以使用函数指针,调用函数,可以参考之前的一篇文章:类的成员函数指针和mem_fun适配器的用法. 简单的函数调用 对于函数: void foo(const string &a ...
- std::function与std::bind 函数指针
function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时. std::function可以绑定到全局函数/类静态成员 ...
- boost function bind ref
boost::function to encapsulate function pointers. 1. function #include <boost/function.hpp> #i ...
- [转] boost::function用法详解
http://blog.csdn.net/benny5609/article/details/2324474 要开始使用 Boost.Function, 就要包含头文件 "boost/fun ...
随机推荐
- C语言调用汇编实现字符串对换
1. 前面配置arm交叉编译环境. 2. 配置好qemu-arm C语言代码string-switch.c: #include <stdio.h> #include <stdlib. ...
- [基础] Loss function (二)
Loss function = Loss term(误差项) + Regularization term(正则项),上次写的是误差项,这次正则项. 正则项的解释没那么直观,需要知道不适定问题,在经典的 ...
- C++类实现AVL树
二叉查找树是个好东西,他让查找,插入,删除,这些常用操作变得高效,但是,他是存在问题的,那就是,在坏的输入序列下,树会退化成链表,这就很尴尬了,于是为了避免这种情况的发生,我们需要一种数据结构,可以自 ...
- EL表达式及其定义和使用 转
作者:http://blog.csdn.net/goskalrie/article/details/51315397 简介 EL(Expression Language)表达式语言实在JSP2.0版本 ...
- Android学习(一)
#常见布局 ###线性布局 有一个布局方向,水平或者竖直 在竖直布局下,左对齐.右对齐,水平居中生效 在水平布局下,顶部对齐.底部对齐.竖直居中生效 权重:按比例分配屏幕的剩余宽度或者高度 ###相对 ...
- CSDN上最火的android项目
CSDN上最火的android项目 直接拿来用!最火的Android开源项目(二) 直接拿来用最火的android开源项目(1)
- ios 利用Reveal来调试界面2--真机调试(步骤详解)
使用真机调试我们的App界面,如果你的真机是没有越狱的设备,那么使用Reveal来调试UI的步骤是最麻烦的.
- ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解
这个项目的底层是用ibatis框架完毕,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后基本的配置都已经配置好了,比方一些事务.日志控制等,在开发中主要用到的是写SQL语句以及熟悉 ...
- [Redux] Using withRouter() to Inject the Params into Connected Components
We will learn how to use withRouter() to inject params provided by React Router into connected compo ...
- hadoop错误org.apache.hadoop.util.DiskChecker$DiskErrorException Could not find any valid local directory for
错误: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory ...