关于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 ...
随机推荐
- What does the “__block” keyword mean?
It tells the compiler that any variable marked by it must be treated in a special way when it is use ...
- Application使用示例
MainActivity如下: package cn.testapplication; import android.os.Bundle; import android.view.View; impo ...
- appium
电话键 KEYCODE_CALL 拨号键 5KEYCODE_ENDCALL 挂机键 6KEYCODE_HOME 按键Home 3KEYCODE_MENU 菜单键 82KEYCODE_BACK 返回键 ...
- jQuery获取鼠标事件源(万能)
//任意位置 $(document).ready(function(){ $(document).click(function(){ $("#id_").hide(); }); } ...
- UIwebView实现html的离线缓存
1.html的缓存主要採取ASIHTTPRequest的缓存策略 (1).设置缓存策略 //设置缓存 ASIDownloadCache *cache=[[ASIDownloadCache alloc] ...
- [AngularJS] angular-formly: Extending Types
Extending types is one of the ways that makes angular-formly help you keep your Angular forms DRY. W ...
- C++之枚举
1. 声明枚举类型格式 enum Day{ Mon,Tue=5,Wed};//Mon=0;Tue=5;Wed=6 enumDay1{Mon1,Tue1,Wed1};//Mon1=0;Tue1=1;We ...
- extjs_02_grid(显示本地数据,显示跨域数据)
1.显示表格 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8 ...
- android 65 文件访问权限
package com.itheima.createfile; import java.io.File; import java.io.FileNotFoundException; import ja ...
- pcap文件格式
pcap文件格式 pcap文件格式是bpf保存原始数据包的格式,很多软件都在使用,比如tcpdump.wireshark等等,了解pcap格式可以加深对原始数据包的了解,自己也可以手工构造任意的数 ...