传递function_boost库function与bind

boost库function与bind
一、function 头文件:boost/function.hpp function更合适的说法我觉得是一种回调函数的表现方式。
boost::function是一个函数对象的“容器”,概念上像是C/C++中函数指针类型的泛化,是一种“智能函数指针”。它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象。在声明 functions 时,声明中最重要的部分是函数的签名。这部分即是告诉 function 它将保存的函数或函数对象的签名和返回类型。
boost::function能够代替函数指针,并且能能接受函数或函数对象,增加了程序的灵活性。但是boost::function相比函数指针来说体积稍大一点,速度上稍慢一点。
函数原型:boost::function f;
看一个简单的例子:
#include
#include
#include typedef boost::functionFunc;int test(int num,char ch)
{std::cout< 结果是:
localhost@localhost:/mnt/hgfs/share/boost$ ./function
1 a二、bind 头文件:boost/bind.hpp
bind的基本形式如下:
template bind(F f);
template bind(F f,A1 a1);
namespace
{
boost::arg _1;
boost::arg
_2;
boost::arg
_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
#include
#include
#include "boost/bind.hpp"void print_string(const std::string s)
{ std::cout << s << 'n';
}
void print_functionname()
{std::cout << "Print_functionname" < 结果:
localhost@localhost:/mnt/hgfs/share/boost$ ./bind
Print_functionname包含类的例子:
#include
#include
#include
#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
#include
#include typedef boost::functionFunc;void print_string(const std::string s)
{std::cout<<"s:"< 结果:
localhost@localhost:/mnt/hgfs/share/boost$ ./bind1
s:hello bind参考文章:https://www.cnblogs.com/blueoverflow/p/4740093.html
想了解学习更多C++后台服务器方面的知识,请关注: 微信公众号:====C++后台服务器开发====
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
