boost库 bind/function的使用

Boost::Function 是对函数指针的对象化封装,在概念上与广义上的回调函数类似。相对于函数指针,function除了使用自由函数,还可以使用函数对象,甚至是类的成员函数,这个就很强大了哈


#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>using namespace std;class TestA
{public:void method(){cout<<"TestA: method: no arguments"<<endl;}void method(int a, int b){cout<<"TestA: method: with arguments"<<"value of a is:"<<a <<"value of b is "<<b <<endl;}
};void sum(int a, int b)
{int sum = a + b;cout<<"sum: "<<sum<<endl;
} int main()
{boost::function<void()> f;TestA test;f = boost::bind(&TestA::method, &test);f();f = boost::bind(&TestA::method, &test, 1, 2);f();f = boost::bind(&sum, 1, 2);f();
}


2. 应用:Thread封装

在实现自定义的线程类时,曾经这么干过:定义虚函数run(),用户自定义的CustomThread::Thread后,自己实现run()函数就OK了。 当时觉得这么做也不错。
现在有了boost::function/boost::bind我们可以这么干:
定义一个线程类:
.h文件

#include <pthread.h>
#include <string>
#include <boost/function.hpp>
#include <boost/bind.hpp>using namespace std;
class Thread
{typedef boost::function<void()> ThreadFun;public:Thread(const ThreadFun& threadFun,const string& threadName = string());pid_t     getThreadId();string    getThreadName();int       start();private:static void* startThread(void* thread);private:pthread_t   m_thread; //线程句柄pid_t       m_tid;    //线程IDstring      m_strThreadName;    //线程名称bool        m_bStarted;         //线程是否启动ThreadFun   m_func;             //线程处理函数
};

.cpp

#include "thread.h"Thread::Thread(const Thread::ThreadFun& threadFun, const string& threadName):
m_func(threadFun), m_strThreadName(threadName)
{
}int Thread::start()
{m_tid = pthread_create(&m_thread, NULL, &startThread, this);return 0;
}void* Thread::startThread(void* obj)
{Thread* thread = static_cast<Thread*>(obj);thread->m_func();return NULL;
}pid_t Thread::getThreadId()
{return m_tid;
};string  Thread::getThreadName()
{return m_strThreadName;
}

void ThreadProcess()
{int count = 100;for (int i = 0; i < count; i++){if (i % 10 == 0)    cout<<"\n";cout<<i<<"\t";}
}int main()
{boost::function<void()> f;f = boost::bind(&ThreadProcess);    Thread thread(f, "ThreadTest");thread.start();sleep(1000*1000);return 0;
}


 



转载于:https://www.cnblogs.com/mtcnn/p/9410077.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10恢复出厂设置_Mac系统如何恢复出厂设置

苹果Mac电脑在什么情况下需要恢复出厂设置呢&#xff1f;例如系统数据损坏、遇到无法卸载的恶意软件、错误更新导致、或者你只是想要闲鱼出售你的Mac电脑&#xff0c;这里系统派教你Mac如何恢复出厂设置。我们先简单将恢复出厂分成两步&#xff0c;一是擦除硬盘数据&#xff0c…

微信小程序蓝牙连接硬件设备并进行通讯,小程序蓝牙因距离异常断开自动重连,js实现crc校验位

一、小程序实现搜索蓝牙&#xff1a; 注意&#xff1a;comtl是我封装的工具函数&#xff0c;无关紧要&#xff0c;实际项目中可能用不到&#xff1a; const comtl require(../../utils/commontool) const app getApp() // 拿到全局定义的变量&#xff0c;需要在app.js中&…

Java Learning Path(三)过程篇

Java Learning Path&#xff08;三&#xff09;过程篇   每个人的学习方法是不同的&#xff0c;一个人的方法不见得适合另一个人&#xff0c;我只能是谈自己的学习方法。因为我学习Java是完全自学的&#xff0c;从来没有问过别人&#xff0c;所以学习的过程基本上完全是自己…

依赖注入的三种方式_Java核心知识 Spring原理十 Spring 依赖注入四种方式

构造器注入/*带参数&#xff0c;方便利用构造器进行注入*/ public CatDaoImpl(String message){ this. message message; } setter 方法注入public class Id { private int id; public int getId() { return id; } public void setId(int id) { this.id id; } } 静态工厂注入…

闪退没由报错_关于floor()报错注入,你真的懂了吗?

0x01 简述floor报错注入也有叫group报错注入的&#xff0c;都一样&#xff0c;指的都是他们。floor报错注入我想大多数人跟我一样&#xff0c;都是会用而不明白其中的原理。这个问题困扰了在下好长时间了&#xff0c;所以决定好好研究下&#xff0c;最终产出了这篇文章。0x02 环…

JS十六进制转浮点、字符串转为ArrayBuffer、ArrayBuffer转16进制字符串、16进制转10进制、crc校验位、十六进制转中文字符串(小程序、浏览器)、十六进制字符串转ascall字串

h5实现一键复制文本到剪切板 // 复制文本到剪切板 export function copyText (text) {// 将内容转换为字符串&#xff1a;const textString text.toString()// 获取input输入框&#xff0c;没有dom元素的话需要自动生成let input document.querySelector(#copy-input)if (!i…

Photoshop(CC2020)未完

基础知识&#xff1a; 概括&#xff1a; Adobe Photoshop&#xff0c;简称PS&#xff0c;是由美国Adobe Systems开发和发行的图像处理软件。属于再加工型软件&#xff0c;是对很多素材的再次加工处理&#xff0c;并非原创型软件。 功能:Photoshop主要处理以像素构成的位图图像…

使用 做签名的post_基础实操|使用jmeter对聊天软件进行接口测试

前言准备上架一款聊天app&#xff0c;上架之前准备做一些测试工作&#xff0c;模拟用户进入房间&#xff0c;维持心跳&#xff0c;房间送礼&#xff0c;发言等行为(因为用的第三方im以及声网&#xff0c;这些都是基于http的)&#xff0c;也不是很懂测试&#xff0c;听老大说过一…

spring boot配置ip_Spring Cloud 配置中心高可用搭建

本文通过config server连接git仓库来实现配置中心&#xff0c;除了git还可以使用svn或者系统本地目录都行。引入依赖<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artif…

MySQL中主键的选择与磁盘性能

偶然看到了“Fotolog: Scaling the World\s Largest Photo Blogging Community”&#xff0c;才发现很多数据库的优化其实道理都很简单&#xff0c;至高境界是当你面对问题时&#xff0c;是否真正做出了自己的思考&#xff0c;而不仅仅只是经验主义的惯性使然&#xff1a;本文案…

python找钱_python 递归 找零钱

首先回答你的问题 count 1 coins_changeREC(coin_values, change-value)#1.when reached here, one recursion link ends if count < min_count: min_count count #2. update the minimum count of coins 每次走到注释1的地方的时候&#xff0c;对于一个coin_value开始的…

qt 等待线程结束_c – 停止Qt线程:调用exit()或quit()不会停止线程执行

在main()即主线程中创建了一个QThread.将一个worker类移动到新线程.该线程执行worker类的’StartThread’方法.工人线程&#xff1a;//header fileclass Worker : public QObject{Q_OBJECTpublic:Worker(QThread* thread);public slots:void StartThread();void EndThread();pr…

rcnn spp_net hcp

rcnn开创性工作&#xff0c;但是计算时间太长&#xff0c;重复计算太大。 spp_net将重复计算避免了。 hcp是yan shuicheng那边的&#xff0c;是用bing生成regions&#xff0c;然后用normalized cut将这些regions进行聚类&#xff0c;然后将聚类后剩下较小数量的regions进cnn&am…

eslint语法报错解决

今天将之前一个项目加入了eslint&#xff0c;发现很多变报错&#xff0c;但是反复检查自己代码是没有错误的&#xff0c;根据报错信息可知是某些api在eslint语法中使用不规范导致&#xff0c;大概总结如下&#xff1a; 1.setup中接收props 报错&#xff1a;Getting a value f…

MediaRecorder录像怎么旋转呀?

问题描述最近做的项目摄像头是跟手机按90度安装的&#xff0c;用MediaRecorder录像还是按摄像头的方向而不是手机的方向&#xff0c;录出来的是90度旋转的&#xff0c;试了很多方法都不管用。MediaRecorder.setOrientationHint没有效果&#xff0c;在底层AuthorDriver那都没有对…

简述python定义中的五个要点_Python基础知识复习

1.切片操作三个参数的意义&#xff1a;切片是Python序列的重要操作之一&#xff0c;适用于列表、元组、字符串、range对象等类型。切片使用2个冒号分隔的3个数字来完成&#xff0c;第一个数字表示切片开始位置(默认为0)&#xff0c;第二个数字表示切片截止(但不包含)位置(默认为…

matlab畸变校正代码_关于OpenCV中的去畸变

在opencv中&#xff0c;有关图像或像素点&#xff08;角点&#xff09;去畸变的函数有cv::undistort()&#xff0c;cv::getOptimalNewCameraMatrix()&#xff0c;cv::initUndistortRectifyMap()&#xff0c;remap()&#xff0c;cv::undistortPoints()。其中undistort可以直接对…

redis数据库简介、redis下载及安装(win64位)、node操作redis、redis实现短信校验注册接口

redis简介&#xff1a; 1:内存数据库,同时也能够保存数据到磁盘&#xff1b; 2:比其他的内存数据库有着更多的数据类型&#xff1a; 列表,集合,排序集合,哈希表等; 3:主从结构&#xff1a;数据可以备份到从服务器&#xff1b; 4: Redis数据操作速度快; 5:所有的操作都是原…

go func()和 go_Go的泛型真的要来了—如何使用以及它们是怎么工作的

点击上方蓝色“Go语言中文网”关注我们&#xff0c;领全套Go资料&#xff0c;每天学习 Go 语言你没看错&#xff0c;这里讲的就是 Go 中的泛型。只不过还没有正式发布&#xff0c;是基于草案设计的&#xff0c;已经是实现了可运行的版本。所以&#xff0c;泛型到来真的不远了&a…

bios设置_bios怎么设置显存 bios设置显存教程【图文】

有些用户可能会发现打开电脑系统信息窗口显示的内存容量与实际容量不同&#xff0c;例如系统内存显示4G&#xff0c;可用3.73G。那么不可用的那部分内存到哪里去了呢?其实是被集成显卡占用当做显存使用了。下面我们就通过 bios设置显存 来调整占用内存容量的大小&#xff0c;我…