boost库function与bind


一、function 头文件:boost/function.hpp function更合适的说法我觉得是一种回调函数的表现方式。

boost::function是一个函数对象的“容器”,概念上像是C/C++中函数指针类型的泛化,是一种“智能函数指针”。它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象。在声明 functions 时,声明中最重要的部分是函数的签名。这部分即是告诉 function 它将保存的函数或函数对象的签名和返回类型。

boost::function能够代替函数指针,并且能能接受函数或函数对象,增加了程序的灵活性。但是boost::function相比函数指针来说体积稍大一点,速度上稍慢一点。


函数原型:boost::function f;

看一个简单的例子:

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>typedef boost::function<int(int,char)>Func;int test(int num,char ch)
{std::cout<<num<<" "<<ch<<std::endl;
}int main()
{Func f;f = &test;f(1,'a');return 0;
}//回调函数

结果是:

localhost@localhost:/mnt/hgfs/share/boost$ ./function
1 a


二、bind 头文件:boost/bind.hpp

bind的基本形式如下:

template<class R,class F> bind(F f);
template<class R,class F,class A1> bind(F f,A1 a1);
namespace
{
boost::arg<1> _1;
boost::arg<2> _2;
boost::arg<3> _3;
…..                                     //其他6个占位符
};

bind接收的第一个参数必须是一个可调用的对象f,包括函数函数指针函数对象、和成员函数指针,之后bind最多接受9个参数参数数量必须与f的参数数量相等,这些参数被传递给f作为入参。 绑定完成后,bind返回一个函数对象,它内部保存了f的拷贝,具有operator()返回值类型自动推导f的返回类型。在发生调用时这个函数对象将把之前存储的参数转发给f完成调用。例如,有一个函数func,它的形式是:

1 func(a1,a2);

那么,他将等价于一个具有无参operator()的bind函数对象调用:

1 bind(func,a1,a2)();

这是bind最简单的形式,bind表达式存储了func和a1、a2的拷贝,产生了一个临时函数对象。因为func接收两个参数,而a1和a2的拷贝传递给func完成真正的函数调用。

bind的真正威力在于它的占位符,它们分别定义为_1,_2,_3,一直到 _9,位于一个匿名的名字空间。占位符可以取代bind参数的位置,在发生调用时接受真正的参数占位符的名字表示它在调用式中的顺序,而在绑定的表达式中没有没有顺序的要求,_1不一定必须第一个出现,也不一定只出现一次,例如:

1 bind(func,_2,_1)(a1,a2);

返回一个具有两个参数的函数对象,第一个参数将放在func的第二个位置,而第二个参数则放在第一个位置,调用时等价于:

1 func(a2,a1);

看一下例子:

#include <functional>
#include <iostream>
#include <string>
#include "boost/bind.hpp"void print_string(const std::string s)
{  std::cout << s << 'n';
}
void print_functionname()
{std::cout << "Print_functionname" <<std::endl;
}int main()
{boost::bind(print_functionname)();return 0;
}

结果:

localhost@localhost:/mnt/hgfs/share/boost$ ./bind
Print_functionname

包含类的例子:

#include <functional>
#include <iostream>
#include <string>
#include "boost/bind.hpp"
class Test
{
public:      void print_string(const std::string& s) const{    std::cout << s << 'n'; }void print(){std::cout << "Test" << std::endl;}
};int main()
{Test ts;boost::bind(&Test::print,_1)(ts);boost::bind(&Test::print_string,_1,_2)(ts,"hello Test");return 0;
}

结果:

localhost@localhost:/mnt/hgfs/share/boost$ ./bind
Test
hello Test


三、function与bind联合使用 一般bind和function会在一起使用,这里只写一个简单的例子

#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>typedef boost::function<void(void)>Func;void print_string(const std::string s)
{std::cout<<"s:"<<s<<std::endl;
}int main()
{Func f(boost::bind(print_string,"hello bind"));f();return 0;
}

结果:

localhost@localhost:/mnt/hgfs/share/boost$ ./bind1
s:hello bind


参考文章:https://www.cnblogs.com/blueoverflow/p/4740093.html


想了解学习更多C++后台服务器方面的知识,请关注: 微信公众号:====C++后台服务器开发====


传递function_boost库function与bind相关推荐

  1. 【Boost】boost库中function和bind一起使用的技巧(一)

    1 bind/function 引 (1)头文件 bind函数#include <boost/bind.hpp> function使用头文件#include <boost/funct ...

  2. c++ Boost库之boost::bind学习

    刚开始学c++,就看boost库其实有点小小的不情愿. 团队要求必掌握的Boost库: boost::bind boost::function boost::Signals2 学习前奏:在写关于coc ...

  3. C++11 std::function, std::bind, std::ref, std::cref

    C++11 std::function, std::bind, std::ref, std::cref 转自:http://www.jellythink.com/ std::function 看看这段 ...

  4. 【转载】C++ function、bind和lambda表达式

    本篇随笔为转载,原贴地址:C++ function.bind和lambda表达式. 本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制 ...

  5. C++11 function和bind用法

    目录 function和bind用法 function的用法 Demo bind用法 Demo C/C++Linux服务器开发/后台架构师[零声教育]-学习视频教程-腾讯课堂 function和bin ...

  6. bar.bind.bind_JavaScript中的function.prototype.bind和function.prototype.length解释

    bar.bind.bind 功能绑定 (Function Bind) bind is a method on the prototype of all functions in JavaScript. ...

  7. C++程序设计之可调用对象与标准库function

    C++程序设计之可调用对象与标准库function,来源于C++ Primer(第五版)-- 14.8.3..在头文件<functional>中定义. 源代码如下: #include &l ...

  8. 2.cocos2dx 3.2中语法的不同之处,lambada表达式的使用和function和bind函数的使用

    1        打开建好的T32  Cocos2dx-3.2的一个项目 2        设置Cocos显示窗口的位置是在AppDelegate.cpp中: 3  设置自适应窗口大小的代码是在上面的 ...

  9. 聊聊Function的bind()

    bind顾名思义,绑定. bind()方法会创建一个新函数,当这个新函数被调用时,它的this值是传递给bind()的第一个参数,它的参数是bind()的其他参数和其原本的参数. 上面这个定义最后一句 ...

最新文章

  1. android aidl调用进程间服务的方法
  2. 微信整人假红包图片_警惕:千万别点!这些红包是假的
  3. Windows上快速在指定目录打开cmd.exe命令行的方法
  4. 状态反射在体育运动中的作用_体育运动木地板时刻运行在最佳状态的秘诀
  5. linux内存平均值,linux下查看内存使用情况[转载]
  6. 解决clipboard手机端无法复制的一种思路
  7. adb工具下载及安装
  8. Visio 2019中文版软件下载和安装教程
  9. 程序基本编写方法python_python程序设计基本编写方法
  10. MultiTask Learning Survey
  11. 心理学入门必读好物,《亲密关系》精华版
  12. data单复数一样吗_Data和media的复数是什么?——别以为你很懂复数!
  13. zookeeper学习笔记(一)--快速入门与集群部署
  14. 基于矩阵分解模型的协同过滤理论概述(涉及到SVD,SVD++,TimeSVD++)
  15. Django分页,过滤:
  16. 51单片机small compact large区别
  17. 【题目】NKOJ-4247 老蒋的数列
  18. view \function\行转列的方法。
  19. python程序设计基础刘艳网课_智慧职教APPPython程序设计基础(九江职业技术学院)题目答案...
  20. kitt2bag 解决“Failed to find match for field intensity”问题

热门文章

  1. C#语法:委托与方法
  2. 内部矩阵维度必须一致simulink_简单五步实现 MATLAB/Simulink 锂电池建模
  3. Android App层 单独使用SystemProperties
  4. php运行socket服务器,PHP_php简单socket服务器客户端代码实例,本篇文章分享一个简单的socket - phpStudy...
  5. 英伟达账号登录邮箱验证收不到_【硬核教学】解决登录230锁定
  6. python多个list合并成一个table_python – 将同一表模式的多个备份合并到一个主表中...
  7. webstorm如何自动换行_怎样在word中自动生成目录
  8. 16 input默认样式清除
  9. (一)为什么要UML
  10. Protocol buffer的使用案例