程序开发基础学习三(boost::bind 函数学习)

boost::bind 不能处理函数重载 (error: no matching function for call to ‘bind‘) 🚀 优质资源分享 🚀 学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 前言 最近任务多、工期紧,没有时间更新博客,就水一期吧。虽然是水,也不能太失水准,刚好最近工作中遇到一个 boost::bind 的问题,花费了半天时间来定位解决,就说 阅读详情

        工作中要用到boost库,我的学习习惯是在学习新的知识的时候,将整个知识点的历史和发展现状过一遍。这样既能激发学习兴趣,同时对于知识点的记忆和学习能形成一个完整的系统结构。boost库最新版本是1.47,今天主要总结boost库里一个常用的函数bind,由于之前从来没有用过这个函数,对这个函数的一些妙用也不甚了解。

        我对bind函数的理解是,bind现在最大支持九个参数,通过对bind传递不同的参数,最后返回一个新的函数指针,通过这个函数指针的调用变相的产生新的函数。我先用普通方法简单模拟一下,大概说明白bind 的原理就行。代码如下:

#include "stdafx.h"
#include <iostream>
#include "boost/bind.hpp"
#include "boost/function.hpp"
using namespace std;


void PrintHello(int i)
{
        cout<<"hello, world.\n";
}
void CallFuntion(void (*f)(int), int i)
{
        f(i);
}


int _tmain(int argc, _TCHAR* argv[])
{
       CallFuntion(PrintHello, 2);
       getchar();
       return 0;
}

        这个就是通过传递函数PrintHello的函数指针给CallFuntion函数,当然了,有人说直接调用PrintHello多省事,呵呵,说的没错,看看下面bind的几种用法吧。

        1、bind构造普通函数

#include "stdafx.h"
#include <iostream>
#include "boost/bind.hpp"
#include "boost/function.hpp"
using namespace std;

void PrintHello(int i)
{
	cout<<"hello, world.\n";
}
void CallFuntion(void (*f)(int), int i)
{
	f(i);
}

void CallBindFunction(boost::function<void (void)> f)
{
	f();
}
int _tmain(int argc, _TCHAR* argv[])
{
	CallFuntion(PrintHello, 2);
	CallBindFunction(boost::bind(PrintHello, 2));
	getchar();
	return 0;
}

        看见区别了吧,通过配合boost里的function函数,不就可以实现函数变参了,这就是bind的一种妙用。

         2、bind函数调整参数

#include "stdafx.h"
#include <iostream>
#include "boost/bind.hpp"
#include "boost/function.hpp"
using namespace std;


int Sum2(int i, int j)
{
	return i + j;
}


int _tmain(int argc, _TCHAR* argv[])
{
	cout<<Sum2(1, 2)<<endl;	// Sum2(x, y);

	boost::function<int (int, int)> f11 = boost::bind(Sum2, _1, _1);     // Sum2(x, x);

	cout<<f11(1, 2)<<endl;
	boost::function<int (int, int)> f21 = boost::bind(Sum2, _2, _1);	 // Sum2(y, x);
	cout<<f21(1, 2)<<endl;

	boost::function<int (int, int)> f12 = boost::bind(Sum2, _2, _2);     // Sum2(y, y);
	cout<<f12(1, 2)<<endl;

	boost::function<int (int, int)> f13 = boost::bind(Sum2, _1, 3);		// Sum2(x, 3);
	cout<<f13(1, 2)<<endl;
	getchar();
	return 0;
}


        这就是通过bind函数构造出不同参数的函数,是不是大大加大了代码的复用性和易用性。同时可以在bind的参数里设置构造的新函数默认值。

        3、函数对象

#include "stdafx.h"
#include <iostream>
#include "boost/bind.hpp"
#include "boost/function.hpp"
#include "boost/ref.hpp"
using namespace std;

struct F
{
	int s;
	int operator()(int i){ return s += i;}
	bool operator()(bool b){ return b;}
};

int _tmain(int argc, _TCHAR* argv[])
{
	F f = {0};
	int arry[3] ={1, 2, 3};
	//boost::function<int (int)> sum = boost::bind(boost::ref(f), _1);
	boost::function<int (int)> sum = boost::bind<int>(boost::ref(f), _1);
	for_each(arry, arry + 3, sum);
	assert(f.s != 6);
	return 0;
}

         这里有两个知识点,一个是bind构造的函数要表明返回类型,boost文档给出的解释是: 没有 typeof操作符,返回类型无法推导。其实我们自己也很容易看出来,对于上面申明的两个操作符重载,没有返回类型确实无法分辨。第二个知识点是,引用的问题,假如不添加引用符号ref的话,默认会复制一个新的函数对象,这样的话,前面定义的f的s值不会改变。

        4、成员函数

#include "stdafx.h"
#include <iostream>
#include "boost/bind.hpp"
#include "boost/function.hpp"
#include "boost/ref.hpp"
#include "boost/shared_ptr.hpp"
using namespace std;

struct X
{
	void f(int count)
	{
		for (int i = 0; i < count; ++i)
		{
			cout<<"hello,world.\n";
		}
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	X x;
	boost::shared_ptr<X> p(new X);

	boost::function<void (int)> PrintHello1 = boost::bind(&X::f, boost::ref(x), _1); // x.f(i)
	PrintHello1(1);

	boost::function<void (int)> PrintHello2 = boost::bind(&X::f, &x, _1);	// (&x)->f(i)
	PrintHello2(2);

	boost::function<void (int)> PrintHello3 = boost::bind(&X::f, x, _1);	// (internal copy of x).f(i)
	PrintHello2(3);

	boost::function<void (int)> PrintHello4 = boost::bind(&X::f, p, _1);	// (internal copy of p).f(i)
	PrintHello2(4);
	return 0;
}

        这里注意的是第三种方式和第四种方式,第三种方式里的x将被拷贝,如果x数据结构比较大的话,效率上讲就非常低了,需要注意。第四种也是拷贝,但这里还申明为shared_ptr类型,意思是在出了限定域内不会释放,这boost文档里给出的例子。没有别的意思,就是见到后注意下就行。

        bind基本就这几种用法,还有一些比较巧妙的用法,比如说将bind返回值当作参数传递给bind嵌套用法,还有将function<void (void)> 类型申明为成员函数。有兴趣的话可以看boost文档,或者九天翱雁的关于bind的用法总结。

【BOOST C++ 12 函数式编程】(3) Boost.Boost.Bind Boost.Bind 是一个库,它简化和概括了最初需要 std::bind1st() 和 std::bind2nd() 的功能。这两个函数被添加到 C++ 98 的标准库中,即使它们的签名不兼容,也可以连接函数。 阅读详情

相关推荐

基于boost的bind与function的消息处理框架

算是一个消息处理框架吧,用于说函数对象function与bind的基本用法; 比较适合入门boost的function与bind的基本用法

boost::bind 详解

使用 boost::bind是标准库函数std::bind1st和std::bind2nd的一种泛化形式。其可以支持函数对象、函数、函数指针、成员函数指针,并且绑定任意参数到某个指定值上或者将输入参数传入任意位置。 1. 通过functions和function pointers使用bind 给定如下函数: 1 int f(int a, int b) 2 { 3 retur...

weixin_34227447的博客 824

Android 集成Chrome 浏览器内核 Crosswalk

Crosswalk 内核的兴起与消亡 Android 4.4 版本之前,使用的是基于 androidWebKit 的 WebView 但实际上,由于 Android 的碎片化问题(大量存在不同的 Android 系统版本,并且各个厂商对内置应用进行定制化,有可能用的不是最新的浏览器内核)。这就导致 WebView 在真实环境中对 API 的支持根本无迹可寻,越发混乱。 随着混合开发的兴起,前端对 ...

司马懿的西山居 2万+

boost::bind 的作用

Boost::bind是一个强大的C++库组件,用于处理函数对象和参数的绑定,提供了更灵活的函数调用方式。它在处理回调、STL算法和其他需要函数对象的情况下非常有用。然而,需要注意的是,C++11引入了更现代的函数绑定和Lambda表达式,通常更方便。

点云兔子的博客 527

YOLOv11 改进策略 | HWD:引入 Haar 小波变换,减少信息丢失

在卷积神经网络(CNN)中,下采样(Downsampling)是降低特征图分辨率、扩大感受野的关键操作,通常通过最大池化(MaxPool)或步长为 2 的卷积(Strided Convolution)实现。然而,这些方法在降低分辨率的同时,往往会丢失图像中的高频细节信息(如边缘、纹理)和精确的空间位置信息,这可能对后续特征提取和目标检测精度产生不利影响,尤其是对于小目标和需要精细定位的任务。

走向CTO的路上... 1788

Python数据分析案例——宏观经济指标与沪深指数实证研究分析

沪深300指数与宏观经济指标关联性研究:2015-2024实证分析 摘要:本文基于2015-2024年月度数据,采用多元回归方法分析宏观经济指标对沪深300指数的影响。研究发现,市场情绪(SEN)、美国利率(STY)、美元指数(DXY)、狭义货币供应量(M1)和CPI对指数具有显著解释力(P<0.05),而GDP、LPR等传统指标影响不显著。模型解释力达62%(R²=0.62),表明A股短期走势更受资金流动、投资者心理和国际金融条件驱动。研究为投资者提供了除基本面外的市场预判指标,建议关注M1增速、美

weixin_50902344的博客 1404

Boost::bind使用详解

boost::bind

zxnzjccmily的博客 2351

jmeter5.4.1 使用案例

jmeter主要用于接口压力测试,模拟海量请求并发访问接口 1.下载jmeter https://jmeter.apache.org/download_jmeter.cgi 2.启动jemter 双击即可 3.配置jmeter 1.先更改语言 2.创建线程组 配置线程执行规划 3.创建http请求默认值 4.创建http请求 5.创建http信息头管理器 指定 Content-Type:application/json 6.创建响应断言 7.创建察看结果数 直接点击 执行 按.

SpringHASh的博客 1221

关于c++ boost::bind的一些理解

1 介绍 一般来说boost::bind有两种方式的调用,一种是对自由方法,也取非类方法, 一种是对类方法。 方式一: 直接boost::bind(函数名, 参数1,参数2,…) 方式二: 对类方法来说,直接boost::bind(&类名::方法名,类实例指针,参数1,参数2) 而boost::function也是一种函数对象。 需要注意的一点是,boost::bind里的参数个数一定要与被bind的函数相同。 2 用法 【bind】 一般用法:bind用于一般普通函数( 以非类、结构的成员函数 )

bj318318的博客 6760

汽车UDS诊断详解及Vector相关工具链使用说明——总述

1.什么是诊断 车辆在运行过程中,不可避免地会发生一些故障,为了确保行车安全,我们要求车上的ECU能够实时监测部件的运行状态,一旦发现异常情况,能通过点亮报警灯等方式提示驾驶员。但是,点亮报警灯只能告诉驾驶员车辆发生了故障,最多只能定位到故障ECU,比如ABS报警灯亮说明ABS系统出现故障,但具体是什么部件发生故障并不能通过报警灯显示出来。这时就需要ECU在本地存储一个与故障相对应的故障代码,在进行维修的时候,可以通过车上的OBD接口连接诊断仪,把这个存储的故障代码读取出来,从而进一步定位到更加具体的故障部

weixin_42967006的博客 2万+

一次携程酒店 phantom-token 逆向实战复盘(附python纯算)

摘要 本文介绍了通过分析携程酒店列表页面的数据接口,使用Python实现抓取的方法。主要内容包括: 目标站点为携程酒店列表页,通过开发者工具发现关键接口fetchHotelList 将浏览器请求转换为Python代码,包含请求头(headers)、Cookies和POST数据 提供完整的请求示例代码,包含日期参数、城市ID等必要信息 特别声明仅供学习交流使用,禁止商业用途 展示了如何获取酒店列表数据,包括排序筛选等参数设置 该方法可用于研究酒店数据采集,但需要注意遵守网站使用条款。

自成背后的博客 3020

Boost库-功能介绍-Boost::bind对象-函数接口参数修改

文章目录1.全局函数2.成员函数3.成员变量4.函数对象5.保存表达式6.作者答疑   bind接收的第一个参数必须是一个可调用的对象f,包括函数、函数指针、函数对象、和成员函数指针,之后bind最多接受9个参数,参数数量必须与f的参数数量相等,这些参数被传递给f作为入参。 绑定完成后,bind会返回一个函数对象,它内部保存了f的拷贝,具有operator(),返回值类型被自动推导为f的返回类型。在发生调用时这个函数对象将把之前存储的参数转发给f完成调用。bind实现的主要功能就是修改调用接口的参数调用形式

插件开发 816

RK3568平台(USB篇)USB基础知识

现象:把USB设备比如Android手机接到PC答1:是USB控制器,是USB控制器内嵌的root hub.答2. windows里已经有了USB的总线驱动程序,接入USB设备后,是"总线驱动程序"知道你是"android phone"提示你安装的是"设备驱动程序"。USB总线驱动程序负责:识别USB设备, 给USB设备找到对应的驱动程序。答3. PC的USB口内部,D-和D+接有15K的下拉电阻,未接USB设备时为低电平USB设备的USB口内部,D-或D+接有1.5K的上拉电阻;

weixin_49303682的博客 1658

以boost::function和boost:bind取代虚函数

以boost::function和boost:bind取代虚函数 这是一篇比较情绪化的blog,中心思想是“继承就像一条贼船,上去就下不来了”,而借助boost::function和boost::bind,大多数情况下,你都不用上贼船。boost::function和boost::bind已经纳入了std::tr1,这或许是C++0x最值得期待的功能,它将彻底改变C++库的设计方式,以及应

陈硕的Blog 7万+

AppStore逆向分析(登录、查询、下单)

某网站全协议流程逆向与分析(自动登录、激活、查询、下单)

吴秋霖的博客 3024

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

boost::asio序列: boost::bind 和 std::bind

1. 采用boost::bind #include <iostream> #include <boost/asio.hpp> #include <boost/bind.hpp> #include <boost/date_time/posix_time/posix_time.hpp> void print(const boost::system:...

hit1524468的专栏 1401

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

boost::bind 函数绑定

当我们使用函数时习惯于C函数的格式,即如下形式 resulttype funname( arglist ); 返回值类型 函数名( 参数列表 ); 在Boost.Function中,我们可以方便的定义定义函数对象。不过在定义用来表示类成员函数的函数对象时 第一个参数是类指针。而且在调用时,要传入一个类实例的指针。这样用起来并不是很方便,因为调用者 要知道类实例。这实际上没有实现解耦。

晴天的专栏 5263

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

boost::bind的使用

<br />最近在几经波折之后,终于对于boost::bind有点理解了。对于习惯了其他语言的人来说,boost::bind是个挺神奇的东西,它可以将你的方法适配成任何其他的方法。其实这得益于c++的模板以及操作符重载,去看boost::bind的实现就会发现它是一个有n多重载的函数,这些重载主要是为了适应函数的参数个数。<br /> <br />其实boost::bind的原理是函数对象,而函数对象就是一个重载了()操作符的对象,这样我们就可以像调用一个方法一样来调用一个类上的这个操作符,比如a(),其实

无心云 3万+

[Boost基础]函数与回调——bind绑定

#pragma once #include #include #include #include #include #include using namespace std; using namespace boost; //bind是C++98标准库中函数适配器bind1st、bind2nd的泛化和增强,可以适配任意的可调用对象,包括函数,函数指针,函数引用,成员函数指针和

超越 2791

boost::function和boost::bind

http://www.xumenger.com/cpp-boost-bind-function-20180612/ boost::function boost::function是一个函数包装器,也即一个函数模板,可以用来代替拥有相同返回类型,相同参数类型,以及相同参数个数的各个不同的函数 #include&lt;boost/function.hpp&gt; #include&lt;ios...

zzhongcy的专栏 5034

boost bind初步探究

最近对boost的bind部分比较感兴趣,对其背后的机制进行了简单的分析,和大家分享一下。 注,我所看的代码是boost_1_51_0, 想来各个版本的差异不大。 从一个例子开始 直接上代码(从官方网站摘取) 定义函数 int f(int a, int b) { return a + b; } int g(int a, int b, int c) {

doon的专栏 5486

Please use boost/bind/bind.hpp + using namespace boost::placeholders

The practice of declaring the Bind placeholders (_1, _2, …) in the global namespace is deprecated. Please use <boost/bind/bind.hpp> + using namespace boost::placeholders, or define BOOST_BIND_GLOBAL_PLACEHOLDERS to retain the current behavior. 提示war

Betterc5的博客 4391

Boost Bind 类成员函数指针

// Test_BOOST_BIND_FUNCTION.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include #include #include #include class button { public: boost::function onClick; }; class player {

zhouchuan15的专栏 4482
上一篇: 程序开发基础学习二(C++ Google Style 命名规则)
下一篇: 程序开发基础学习四(boost::signal2 函数学习)
hackmind
博客等级 码龄16年 187粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值