关于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 ...
随机推荐
- SSH架构
说说项目架构整个变化过程吧 拿用户注册来举例: 数据库里面有一张User表 需要把注册信息存储到User表中 1. 最开始是两层架构 就是cliect + jsp + DB 就是在 ...
- Intellij IDEA调试
这段时间一直在使用Intellij IDEA, 今天把调试区工具的使用方法记录于此. 先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 ...
- kafka broker 进入 conflicted ephemeral node 死循环
转载请注明原创地址 http://www.cnblogs.com/dongxiao-yang/p/5621303.html 最近发现kafka一台服务器producer客户端写入时一直报错,查看该br ...
- PTA 06-图3 六度空间 (30分)
"六度空间"理论又称作"六度分隔(Six Degrees of Separation)"理论.这个理论可以通俗地阐述为:"你和任何一个陌生人之间所间隔 ...
- 01 Access数据库 测试连接
附件:http://files.cnblogs.com/xe2011/AccesssConnectionState.rar using System.Data.OleDb; using System. ...
- Android怎样改动app不在多任务列表中显示
在实际开发中,我们希望某些activity或者应用程序不在多任务列表中显示,即长按Home键或者多任务button键不显示近期执行的程序,我们能够在对应应用程序的AndroidManifest.xml ...
- android 59 LinearLayout 线性布局
##常见的布局* LinearLayout 线性布局线性布局往左右拉是拉不动的,> 线性布局的朝向 vertical|horizontal> 线性布局的权重 weight 和 0dip一起 ...
- String类的基本用法与注意点,StringBuffer类的用法
package cn.hncu.day8; public class RegExpDemo { public static void main(String[] args) { String str ...
- 读者汇app项目案例源码
这款app是我花一周左右时间做出来的,一款阅读笑话,段子,糗事,脑筋急转弯,神回复,语录,谜语等的休闲娱乐app,用户除了可以浏览他人发布的内容外,自己也可以发布相关内容,和其他人一同分享有趣的内容, ...
- Bash中的$符号
脚本名称:$0 PID:$$ 参数个数:$# 脚本返回值:$? 第x个参数:$x 第10个以上的参数加大括号:${10} 所有参数:$@ #!/bin/bash echo "The prog ...