(转)boost::bind介绍
转自:http://www.cnblogs.com/sld666666/archive/2010/12/14/1905980.html
这篇文章介绍boost::bind()的用法, 文章的主要内容是参考boost的文档。
1. 目的
boost::bind 是std::bindlist 和 std::bind2nd的结合体。它提供一个任意的函数对象(仿函数)、函数、函数指针、成员函数指针。 它可以绑定任意的参数。bind 没有对函数对象有任何的要求。
2. 把bind()用在函数和函数指针上
有如下代码:
- 1 void f(int a, int b)
- 2 {
- 3 cout << a + b << endl;
- 4 }
- 5 void g(int a, int b, int c)
- 6 {
- 7 cout << a + b + c << endl;;
- 8 }
当调用boost::bind(f, 1, 2);的时候, 它会产生一个空的函数对象,这个对象没有参数, 返回 f(1,2).当然我们也可以给它加个参数:
- 1 int a = 10;
- 2 boost::bind(f, _1, 5)(a);
- 3 int x(10),y(20),z(30);
- 4 boost::bind(g,_1,_2,_3)(x, y, z);
结果:
作为和std::bindlst的对比我们可以看下如下的代码:
- 1 std::bind1st(std::ptr_fun(f), 5)(x); // f(5, x)
- 2 boost::bind(f, 5, _1)(x); // f(5, x)
是不是boost::bind()简单多了。
3. 把bind()用在函数对象(仿函数)上
bind()不仅能够用在函数上,而且可以接受任意的函数对象(仿函数)。如:
- 1 class F
- 2 {
- 3 public:
- 4 int operator()(int a, int b)
- 5 {
- 6 cout << a+b <<endl;
- 7 return a+b;
- 8 }
- 9 double operator()(double a, double b)
- 10 {
- 11 cout << a+b<< endl;
- 12 return a +b;
- 13 }
- 14 };
- 15 int _tmain(int argc, _TCHAR* argv[])
- 16 {
- 17 F f;
- 18 int a[] = {1, 2, 3, 4, 5, 6,7};
- 19 double aDouble[] = {1.1, 2.2, 3.3, 4.4,5.5,6.6,7.7};
- 20 for_each(a, a+7, boost::bind<int>(f, _1, _1));
- 21 for_each(aDouble, aDouble+7, boost::bind<double>(f, _1, _1));
- 22 return 0;
- 23 }
4. 把bind()用在成员变量和成员函数上
指向成员变量的指针和指向成员函数的指针和仿函数不一样, 因为他们没有提供operater()。boost用它的第一个参数接受类成员的指针,这样就像用boost::mem_fn()把类成员的指针转化为仿函数一样。如:
- bind(&X::f, args)
就等于
- bind<R>(mem_fn(&X::f), args)//R 是x::f的返回值。
- 列如:
- 1 struct X
- 2 {
- 3 bool f(int a)
- 4 {
- 5 cout << a <<endl;
- 6 return static_cast<bool>(a);
- 7 }
- 8 };
- 9 int _tmain(int argc, _TCHAR* argv[])
- 10 {
- 11 X x;
- 12 boost::shared_ptr<X> p(new X);
- 13 int i = 5;
- 14 boost::bind(&X::f, &x, _1)(i); // (&x)->f(i);
- 15 boost::bind(&X::f, x, _1)(i); //(copy x).f(i);
- 16 boost::bind(&X::f, p, _1)(i); //(copy p)->f(i);
- 17 return 0;
- 18 }
boost::bind()的基本用法就这些, 在使用的过程中发现确实比较爽, 但是这不知道这是不是常常被人批判的语法糖。
(转)boost::bind介绍的更多相关文章
- boost::bind 介绍
boost::bind 介绍 这篇文章介绍boost::bind()的用法, 文章的主要内容是参考boost的文档. 1. 目的 boost::bind 是std::bindlist 和 std: ...
- boost::function和boost::bind 介绍
一. boost::function介绍 原文:http://www.cnblogs.com/sld666666/archive/2010/12/16/1907591.html 本片文章主要介绍boo ...
- boost::bind 和 boost::function 基本用法
这是一篇介绍bind和function用法的文章,起因是近来读陈硕的文章,提到用bind和function替代继承,于是就熟悉了下bind和function的用法,都是一些网上都有的知识,记录一下,期 ...
- 手把手教你实现boost::bind
前言 boost::bind操作想必大家都使用过,它特别神奇,能够绑定函数与参数,绑定后能够改变参数数量,并且还可以使用占位符.它可以绑定普通函数也可以绑定类成员函数.好多小伙伴试图看过boost:: ...
- boost::function 介绍
本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1. 介绍 Boost.Func ...
- boost asio 学习(二)了解boost::bind
2.了解boost::bind使用boost::bind封装一个函数,考虑以下例子示例2a #include <iostream> #include <boost/bind.hpp& ...
- boost::bind的简单实现
前言 在上一篇blog中简单的实现了boost::function,支持带有2个参数的函数/函数指针,函数对象,函数适配器/bind类,以及带有1个参数的成员函数指针. 本文接着来介绍如何实现一个简单 ...
- 1,Boost -> Bind
#include <boost/bind.hpp> #include <boost/shared_ptr.hpp> #include <iostream> usin ...
- boost::bind
bind并不是一个单独的类或函数,而是非常庞大的家族,依据绑定的参数个数和要绑定的调用对象类型,总共有十个不同的形式,但它们的名字都叫bind. bind接受的第一个参数必须是一个可调用对象f,包括函 ...
随机推荐
- Redis 配置文件 Redis.conf 参数说明
Redis 配置文件 Redis.conf 参数说明 参数名 参数说明 参数实例 daemonize 是否以后台守护进程运行,默认为 no, 取值 yes, no daemonize no ...
- Ognl表达式语言
l OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts2框架使用OGNL作为默认的表达式语言. ...
- Android虚拟环境的工具集Genymotion完整安装教程
Genymotion提供Android虚拟环境的工具集.相信很多Android开发者一定受够了速度慢.体验差效率及其地下的官方模拟器了.如果你没有物理机器,又不想忍受官方模拟器的折磨,Genymoti ...
- 对PostgreSQL的prepared statement的深入理解
看官方文档: http://www.postgresql.org/docs/current/static/sql-prepare.html PREPARE creates a prepared sta ...
- Android AndroidManifest 清单文件以及权限具体解释
每一个Android应用都须要一个名为AndroidManifest.xml的程序清单文件,这个清单文件名称是固定的而且放在每一个Android应用的根文件夹下.它定义了该应用对于Android系统来 ...
- VS2012的SVN插件VISUALSVN
http://www.visualsvn.com/visualsvn/download/
- BZOJ 1022 SHOI2008 小约翰的游戏John 博弈论
题目大意:反Nim游戏,即取走最后一个的人输 首先状态1:假设全部的堆都是1,那么堆数为偶先手必胜,否则先手必败 然后状态2:假设有两个堆数量同样且不为1,那么后手拥有控场能力,即: 若先手拿走一堆, ...
- mysql中的存储过程和事务隔离
※存储过程存储过程是保存在数据库上的一段可执行代码.1.定义存储过程的语法是:Create procedure sp_name (参数..)Begin SQL语句End;2.调用它的方法:Call s ...
- Android 断点续传
断点续传指的是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部 ...
- python中HTMLParser简单理解
找一个网页,例如https://www.python.org/events/python-events/,用浏览器查看源码并复制,然后尝试解析一下HTML,输出Python官网发布的会议时间.名称和地 ...