博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost 函数与回调
阅读量:5233 次
发布时间:2019-06-14

本文共 2900 字,大约阅读时间需要 9 分钟。

result_of

含义:result_of可以帮助程序员确定一个调用表达式的返回类型,主要用于泛型编程和其他boost库组件,它已经被纳入TR1

头文件:<boost/utility/result_of.hpp>

命令空间: using namespace boost;

调用表达式:是指一个含有operator()的表达式,函数调用或函数对象调用都可以成为调用表达式,而result_of可以确定这个表达式所返回的类型

ref

来源:STL和Boost中的算法和函数大量使用了函数对象作为判断式或谓词参数,而这些参数都是传值语义,算法或函数内部保留函数对象的拷贝并使用

#include 
using namespace boost;using namespace boost::assign;int main(){ struct square { typedef void result_type; //返回结果的类型定义 void operator()(int &x) { x = x * x; } }; vector
v = (list_of(1), 2, 3, 4, 5); for_each(v.begin(), v.begin(), square()); //输出: 1 , 4 , 9, 16, 25}
View Code

一般情况下传值语义都是可行的,但也有很多特殊的情况,作为参数的函数对象拷贝代价过高(复杂的内部状态),或者不希望拷贝对象(内部状态不应该被改变),甚至拷贝是不可行的(noncopyable,单件)

头文件 :#include <boost/ref.hpp>

命名空间:using namespace boost;

 类摘要:

template
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库

用于回调

 

转载于:https://www.cnblogs.com/penghuster/p/7060133.html

你可能感兴趣的文章
JS事件大全
查看>>
Node.js 命令行程序开发教程
查看>>
TYVJ 1340 折半暴搜+二分
查看>>
自定义readonly属性的用法
查看>>
编译boost.python库
查看>>
[using_microsoft_infopath_2010]Chapter10 与SharePoint Designer工作流集成
查看>>
从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二八║ Nuxt 基础:面向源码研究Nuxt.js...
查看>>
数据类型
查看>>
[八省联考2018]制胡窜
查看>>
链式前向星实现以及它的遍历
查看>>
遭遇php的in_array低性能问题
查看>>
Java获取NTP网络时间
查看>>
oracle pause命令使用
查看>>
[应邀发布]Rapidmind Development Platform Download
查看>>
VC++ GetModuleFileName()获取路径字符串中带波浪线~
查看>>
C++ 检查Windows服务运行状态
查看>>
SQL SERVER 2008 服务器登录名、角色,数据库用户、角色、架构知识点总结
查看>>
python 读取excel数据插入到另外一个excel
查看>>
Linux多任务编程之二:fork()函数及其基础实验(转)
查看>>
Android界面架构(Activity,PhoneWiondow,DecorView)简介
查看>>