boost 函数与回调
result_of
含义:result_of可以帮助程序员确定一个调用表达式的返回类型,主要用于泛型编程和其他boost库组件,它已经被纳入TR1
头文件:<boost/utility/result_of.hpp>
命令空间: using namespace boost;
调用表达式:是指一个含有operator()的表达式,函数调用或函数对象调用都可以成为调用表达式,而result_of可以确定这个表达式所返回的类型
ref
来源:STL和Boost中的算法和函数大量使用了函数对象作为判断式或谓词参数,而这些参数都是传值语义,算法或函数内部保留函数对象的拷贝并使用
#include <boost/assign.hpp>
using namespace boost;
using namespace boost::assign; int main()
{
struct square
{
typedef void result_type; //返回结果的类型定义
void operator()(int &x)
{
x = x * x;
}
};
vector<int> v = (list_of(), , , , );
for_each(v.begin(), v.begin(), square());
//输出: 1 , 4 , 9, 16, 25
}
一般情况下传值语义都是可行的,但也有很多特殊的情况,作为参数的函数对象拷贝代价过高(复杂的内部状态),或者不希望拷贝对象(内部状态不应该被改变),甚至拷贝是不可行的(noncopyable,单件)
头文件 :#include <boost/ref.hpp>
命名空间:using namespace boost;
类摘要:
template<class T> class reference_wrapper
{
public:
explicit reference_wrapper(T& t): t_(&t){}
operator T& () const{return *t_; } T& get() const { return *t_; }
T* get_poiter() const { return t_; }
private:
T* t_;
};
基本用法
reference_wrapper的用法有些类似c++中的引用,就像是被包装对象的一个别名,但它只有在使用T的语境下才能够执行隐性转换,其他的情况下则需要调用类型转换函数或者get()函数才能真正操作被包装对象
reference_wrapper支持拷贝构造和赋值,而引用类型是不可赋值的
工厂函数
reference_wrapper的名字过长,申明引用包装对象很不方便,因而ref库提供了两个便捷的工厂函数ref()和cref(),可以通过参数类型推导很容易构造reference_wrapper对象。
reference_wrapper<T> ref(T& t)
reference_wrapper<T const> cref(T const& t)
操作包装
ref库运用模板元编程技术提供两个特征类is_reference_wrapper和unwrap_reference用于检测reference_wrapper对象
为ref增加函数调用功能
bind
bind是c++98标准库中函数适配器bind1st/bind2nd的泛化和增强,可以适配任意的调用对象,包括函数指针,函数引用,成员函数指针和函数对象。bind远远地超越了stl中的函数绑定器,可以最多9个函数参数
函数名:
#include <boost/bind.hpp>
using namespace boost;
工作原理
bind并不时一个单独的类或函数,而是非常庞大的家族,依据绑定的参数个数和要绑定的调用对象类型,总共有数十个不同的形式,但他们的名字都叫做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接受最多九个参数,参数的数量必须与f的参数数量相等,这些参数将传递给f作为入参
绑定完成后,bind会返回一个函数对象,它内部保存了f的拷贝,具有operator(),返回值类型被自动推导为f的返回值类型,在发生调用时,这个函数对象将把之前存储的参数转发给f完成调用
bind的真正威力在于他的占位符,它们分别定义为_1,_2,_3一直到_9,位于一个匿名名字空间,占位符可以取代bind中参数的位置,在发生函数调用时才接受真正的参数,占位符的名字都是下划线开始,然后是一个数字。
占位符的名字表示他在调用式中的顺序,而在绑定表达式中没有顺序要求。_1不一定要出现在第一个
绑定普通函数
int g(int a, int b, int c) 三元函数
bind(g, 1, 2, 3)()函数指针
绑定成员函数
类的成员函数不同于普通函数,因为成员函数指针不能直接调用operator(),它必须被绑定到一个对象或者指针,然后才能得到this指针,进而调用成员函数,因此bind需要牺牲一个占位符的位置,
bind( &x::func, x, _1, _2, ...)
绑定成员变量
绑定函数对象
function
定义:
function是一个函数对象的容器,概念上像是c/c++中函数指针类型的泛化,是一种“智能函数指针”,它以对象的形式封装了原始的函数指针或函数对象,能够容纳任何符合签名的可调用对象。因此它可以被用于回调机制,暂时保管函数或函数对象,之后需要的时机再调用,使回调机制 拥有更多的弹性
function可以配合bind使用,存储bind表达式的结果,使bind可以被多次调用
头文件:
#include <boost/function.hpp>
using namespace boost;
类摘要
function的声明
使用ref库
用于回调
boost 函数与回调的更多相关文章
- php变量函数,回调函数
一,变量可以直接传递函数 <?php function demo($num , $n )//$n是个函数 { for($i=0;$i<$num;++$i) { if($n($i)) { e ...
- paip.函数方法回调机制跟java php python c++的实现
paip.函数方法回调机制跟java php python c++的实现 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...
- C++中类成员函数作为回调函数
注:与tr1::function对象结合使用,能获得更好的效果,详情见http://blog.csdn.net/this_capslock/article/details/38564719 回调函数是 ...
- Go基础系列:函数(2)——回调函数和闭包
回调函数和闭包 当函数具备以下两种特性的时候,就可以称之为高阶函数(high order functions): 函数可以作为另一个函数的参数(典型用法是回调函数) 函数可以返回另一个函数,即让另一个 ...
- 精读JavaScript模式(五),函数的回调、闭包与重写模式
一.前言 今天地铁上,看到很多拖着行李箱的路人,想回家了. 在上篇博客结尾,记录到了函数的几种创建方式,简单说了下创建差异,以及不同浏览器对于name属性的支持,这篇博客将从第四章函数的回调模式说起. ...
- C++中 线程函数为静态函数 及 类成员函数作为回调函数
线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程堆栈中static只 ...
- Javascript中的回调函数和匿名函数的回调
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Node.js学习笔记(3)——关于回调函数和函数的回调
说明:本人是node.js的初学者,尝试向别人解释这是怎么回事是自我学习的一个好方法.如果你发现有些地方并不是那么正确,欢迎提出来让我知道以便修正,共同进步,谢过^_^. 欢迎交流,本人微 ...
- Javascript中的回调函数和匿名函数的回调示例介绍
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
随机推荐
- Technocup 2020 - Elimination Round 1补题
慢慢来. 题目册 题目 A B C D tag math strings greedy dp 状态 √ √ √ √ //∅,√,× 想法 A. CME res tp A 题意:有\(n\)根火柴,额外 ...
- HDU 4417-Super Mario-线段树+离线
Description Mario is world-famous plumber. His "burly" figure and amazing jumping ability ...
- S03_CH04_AXI_DMA_OV5640摄像头采集系统
S03_CH04_AXI_DMA_OV5640摄像头采集系统 4.1概述 本课程讲解如何搭建基于DMA的图形系统,方案原理和搭建7725的一样,只是OV5640显示的分辨率是1280X720如下,只是 ...
- gin获取全部参数
原文链接:https://blog.csdn.net/keyunq/article/details/82226280 一直都是用结构体接收参数,假如事先不清楚参数名,或者参数是不固定的,就要动态获取. ...
- 使用Enablebuffering多次读取Asp Net Core 3.0 请求体 读取Request.Body流
原文:使用Enablebuffering多次读取Asp Net Core 请求体 使用Enablebuffering多次读取Asp Net Core 请求体 1 .Net Core 2.X时代 使用E ...
- @Html.ActionLink方法
Html.ActionLink:MVC提供的自动构造重写地址的方法,该方法有五个重载 1.Html.ActionLink("linkText","actionName&q ...
- 基于SDP的提议/应答(offer/answer)模型简介
1.引入 在松耦合会议中,会话参数完全由会议创建者来确定,参与者能做的仅仅是根据这些会话参数来加入会议(当然也可以选择不加入).这种情况下,主要要做的就是会话描述,在这里SDP本身就足够了. 但是在更 ...
- Hash一致性算法底层原理
大纲 Hash取余算法 判定哈希算法好坏的四个定义 一致性Hash算法的两大设计 Hash取余算法 hash(Object.key)%N,hash值随Object.key.N的变化而变化. 如果有节点 ...
- MySQL存储引擎MyISAM和InnoDB,索引结构优缺点
MySQL存储引擎MyISAM和InnoDB底层索引结构 深入理解MySQL索引底层数据结构与算法 (各种索引结构优缺点) Myisam和Innodb索引实现的不同(存储结构) 存储引擎作用于什么对象 ...
- nginx解决浏览器跨域问题
1.跨域问题 浏览器出于安全方面的考虑,只允许与本域下的接口交互.不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源. 例如访问www.test1.com 页面, 返回的文件中需要ajax向 ...