【C++11】std::bind,std::function,std::placeholders

c++11之function、bind、placeholders代码使用示例 本文展示了C++中函数绑定的多种用法:1)通过std::bind绑定普通函数实现加法运算;2)绑定类成员函数和静态成员函数;3)使用仿函数进行字符串拼接;4)结合模板类实现数值运算。代码演示了如何通过function和bind将不同可调用对象统一处理,体现了C++函数式编程的灵活性。其中包含构造函数、析构函数调用示例,以及模板类操作符重载的应用场景。 阅读详情

此篇博客主要包含三个C++11的新特性。可用于绑定接收到其他进程消息后的消息处理函数。

一、std::function

    使用时需要包含头文件functional。在实际工作中可实现函数回调,std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式(也是C++11的特性)、函数指针、以及其它函数对象等。

//代码出自链接:http://www.jellythink.com/archives/771
#include <functional>
#include <iostream>
using namespace std;

std::function< int(int)> Functional;

// 普通函数
int TestFunc(int a)
{
    return a;
}

// Lambda表达式
auto lambda = [](int a)->int{ return a; };

// 仿函数(functor)
class Functor
{
public:
    int operator()(int a)
    {
        return a;
    }
};

// 1.类成员函数
// 2.类静态函数
class TestClass
{
public:
    int ClassMember(int a) { return a; }
    static int StaticMember(int a) { return a; }
};

int main()
{
    // 普通函数
    Functional = TestFunc;
    int result = Functional(10);
    cout << "普通函数:"<< result << endl;

    // Lambda表达式
    Functional = lambda;
    result = Functional(20);
    cout << "Lambda表达式:"<< result << endl;

    // 仿函数
    Functor testFunctor;
    Functional = testFunctor;
    result = Functional(30);
    cout << "仿函数:"<< result << endl;

    // 类成员函数
    TestClass testObj;
    Functional = std::bind(&TestClass::ClassMember, testObj, std::placeholders::_1);
    result = Functional(40);
    cout << "类成员函数:"<< result << endl;

    // 类静态函数
    Functional = TestClass::StaticMember;
    result = Functional(50);
    cout << "类静态函数:"<< result << endl;

    return 0;
}

    可以看到function能够存储上述类型函数,并且完成调用。

二、std::bind

定义:

simple(1)	
template <class Fn, class... Args>
  /* unspecified */ bind (Fn&& fn, Args&&... args);
with return type (2)	
template <class Ret, class Fn, class... Args>
  /* unspecified */ bind (Fn&& fn, Args&&... args);

    绑定器,返回基于fn的函数对象,但其参数绑定到args。
每个参数可以绑定到值或占位符:

  • 如果绑定到某个值,则调用返回的函数对象将始终使用该值作为参数。
  • 如果绑定到占位符,则调用返回的函数对象转发传递给调用的参数(由调用的参数决定该值)。
    来自C++Reference的使用例子(懒得自己写.jpg):
// bind example
#include <iostream>     // std::cout
#include <functional>   // std::bind

// a function: (also works with function object: std::divides<double> my_divide;)
double my_divide (double x, double y) {return x/y;}

struct MyPair {
  double a,b;
  double multiply() {return a*b;}
};

int main () {
  using namespace std::placeholders;    // adds visibility of _1, _2, _3,...

  // binding functions:
  auto fn_five = std::bind (my_divide,10,2);               // returns 10/2
  std::cout << fn_five() << '\n';                          // 5

  auto fn_half = std::bind (my_divide,_1,2);               // returns x/2
  std::cout << fn_half(10) << '\n';                        // 5

  auto fn_invert = std::bind (my_divide,_2,_1);            // returns y/x
  std::cout << fn_invert(10,2) << '\n';                    // 0.2

  auto fn_rounding = std::bind<int> (my_divide,_1,_2);     // returns int(x/y)
  std::cout << fn_rounding(10,3) << '\n';                  // 3

  MyPair ten_two {10,2};

  // binding members:
  auto bound_member_fn = std::bind (&MyPair::multiply,_1); // returns x.multiply()
  std::cout << bound_member_fn(ten_two) << '\n';           // 20

  auto bound_member_data = std::bind (&MyPair::a,ten_two); // returns ten_two.a
  std::cout << bound_member_data() << '\n';                // 10

  return 0;
}

    可以看到,bind绑定的参数,可以部分绑定某个值,部分绑定占位符,占位符的顺序也可以自己指定(相当于可以改变调用时的传参顺序),还是很灵活的。这里面不可避免用到了placeholders,下面来讲。

三、 placeholders

定义很简单:

namespace placeholders {
  extern /* unspecified */ _1;
  extern /* unspecified */ _2;
  extern /* unspecified */ _3;
  // ...
}

    他的应用就是bind绑定参数时的占位符,当调用bind返回的函数对象时,带有占位符_1的参数被调用中的第一个参数替换,_2被调用中的第二个参数替换,依此类推。

四、应用

    可以实现消息处理的分配器,用unordered_map做存储,key为消息名,value为对应的处理函数,再用bind绑定处理函数,eg:

std::unordered_map<std::string,std::function<void(arg1,arg2,...)>> dealfuncs;
dealfuncs[cmdname] = std::bind(&someClass::func, this, _1,_2,...);

实现绑定的函数,在消息到来时,根据消息名查找到对应的消息处理函数并调用。

Python结合海康威视工业相机SDK实现高效图像采集与处理 本文详细介绍了如何使用Python结合海康威视工业相机SDK实现高效的图像采集与处理。内容涵盖从环境搭建、SDK核心模块理解,到完整的图像采集流程拆解,包括设备枚举、参数设置、主动取流以及关键的像素格式转换。同时,文章深入探讨了触发模式、参数控制等高级应用,并提供了性能优化建议和可复用的相机操作类封装,帮助开发者快速构建稳定的机器视觉应用。 阅读详情

相关推荐

区块链技术在碳足迹数据存证与溯源中的应用深度解析

消费者扫描产品上的二维码,即可通过区块链浏览器查询到该产品的数字碳标签,并追溯其从茶园到货架的每一步碳足迹数据,以及这些数据是如何被智能合约自动计算和认证的,从而建立起强大的品牌信任。如果说哈希链解决了数据的“存”与“证”的问题,那么智能合约则解决了数据“用”与“管”的自动化问题。综上所述,虽然针对“碳足迹数据可追溯性”这一特定应用场景的公开、标准化的性能基准案例尚不丰富,但现有研究和企业级解决方案(特别是联盟链)已经证明,通过合理的技术选型和架构设计,区块链的性能可以满足实际商业需求。

百态·数智思维 | 聚焦大数据、量化与未来AI 1104

C++入门学习:std::function,std::bind,std::placeholders

std::function 是一个模板类。作用是对C++中的可调用对象进行包装,包括普通函数、成员函数、模板函数、静态函数、lambda表达式等。它的最基本的作用是,简化调用的复杂程度,统一调用的方式。声明方式:std::function< 返回值类型 ( 参数类型1, 参数类型2, ...) >

m0_67254672的博客 2110

4.1 AI Agent对比分析:Coze、Dify、LangGraph,如何选择Agent框架

本文对比分析了三大主流AI Agent框架:Coze(字节跳动平台,可视化开发,适合快速企业应用)、Dify(开源企业级方案,支持定制部署)和LangGraph(代码开发灵活,适合复杂需求)。选择指南建议:需要快速开发选Coze,需开源定制选Dify,复杂灵活需求选LangGraph。核心要点包括理解各框架特点、根据需求评估选择,并提供了实践建议。下节将介绍Coze平台的实战应用。

yonggeit的博客 3144

C++11的占位符std::placeholders

占位符std::placeholders

有风楠来的博客 2万+

【ROS】Nav2源码之nav2_collision_monitor(碰撞监测)详解

nav2_collision_monitor碰撞监视器是一个节点,为机器人提供了一个额外的安全级别。它使用来自传感器的数据,执行若干与避免碰撞相关的任务,绕过成本图和轨迹规划器,监测是否需要紧急停止或者减速。

郭老二 1454

【图像去噪】论文复现:Mamba没Out!MaIR的Pytorch源码复现,跑通全流程,轻松解决环境配置问题,图文结合,明确MaIR创新点,与MambaIR对比,示意图与源码对应,清晰易懂,注释详细!

论文题目:MaIR: A Locality- and Continuity-Preserving Mamba for Image Restoration —— MaIR:用于图像恢复的局部性和连续性保持 Mamba【图像去噪】论文精读:MaIR: A Locality- and Continuity-Preserving Mamba for Image Restoration【图像去噪】论文复现:Man!

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1112

C++ functional

文章目录std::function std::bad_function_callstd::bindstd::ref std::cref std::reference_wrapperstd::mem_fn 类模板std::function是通用多态函数封装器。 std::function的实例能存储、复制及调用任何可调用函数、 lambda表达式、 bind表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。 若 std::function 不含目标,则称它为空。调用空std::function的目

123456789 3819

使用 Python 爬虫获取中国证券市场公司公告数据

本文详细介绍了如何使用 Python 爬虫技术从中国证券市场(如巨潮资讯网)爬取公司公告数据。通过分析网页结构,编写爬虫脚本,抓取并存储公告信息,我们实现了从网页抓取数据的全过程。此外,本文还展示了如何应对反爬虫机制,并介绍了数据分析与可视化的基本方法。未来,我们可以通过机器学习等技术进一步挖掘公告中的潜在信息,例如,通过情感分析对公告内容进行情绪分类,或者预测某些公告类型对股市走势的影响等。希望本文能帮助你理解如何使用 Python 爬虫技术获取和处理证券市场的数据,并为你的数据分析项目提供帮助。

2201_76125261的博客 1886

std::bind()之std::placeholders理解记录

使用 std::bind() 需要添加 #include<functional> 头文件 std::bind()函数接受一个可调用对象及其参数(如果有的话),形成一个新的可调用对象。 可调用对象:普通函数体,Lambda表达式(匿名函数),类成员函数,静态成员函数,仿函数(重载了括号运算符的类)等都可以称为可调用对象。 void TestFunc(int a, char b, float c) { cout << a << endl; cout <&lt

maybcsdn的博客 4503

鲁棒优化 (Robust Optimization) 算法详解及案例分析

鲁棒优化是一种用于处理不确定性优化问题的方法。其目标是在不确定性参数的可能取值范围内,找到一个对不确定性具有鲁棒性的解。

闲人编程的博客 4326

无刷电机FOC硬件电路设计

本文先对MIT无刷电机FOC硬件电路分析做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章软件程序在我另外一个博客【嵌入式–伺服电机】MIT无刷电机FOC驱动程序分析。

qq_35635374的博客 573

c++11函数对象:functional

<functional>主要新增了类模板std::function和函数模板std::bind。 std::function是可调用对象的wrapper,它可以包装函数、lambda表达式、bind表达式、函数对象、成员函数指针、成员变量指针。 std::bind也是一个可调用对象的wrapper,它可将一个可调用对象的部分或全部参数绑定为特定的值,它的返回值可以被std::funct...

https://gitee.com/liuyuan185442111/chest-view 2944

【python股票价格预测】基于CNN-LSTM的股票价格预测(附python代码)

【python股票价格预测】基于CNN-LSTM的股票价格预测(附python代码)

k8291121的博客 2006

C++11 之 std::function、std::bind、std::placeholders

在公司说的项目代码中看到了std::function、std::bind、std::placeholders三个C++11的特性,通过了解之后,发现还是挺有用的,在这里记录下吧。似乎这三个特性一般都是一起使用的,所以也一起讲了。 三个特性都在functional文件中定义,故使用时需要“#include<functional>” 1.基础介绍 这里...

u014209688的专栏 5508

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

c++11新特性之std::function、std::bind、std::placeholders、lambda 表达式的使用

c++11新特性之std::function、std::bind、std::placeholders、lambda 表达式的使用 文章目录c++11新特性之std::function、std::bind、std::placeholders、lambda 表达式的使用结论示例所有的std::function(包括通过std::bind、std::placeholders辅助)都可以使用lambda表达式实现相同效果 结论 1.std::function为函数指针封装,方便调用,std::bind、std::

Jason_Chen__的博客 888

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++11新特性之 std::bind 、std::placeholders、std::function

//std::bind 绑定 //std::placeholders 占位符 //std::function 函数 //这三个一般都是同时出现的 //例: void onParseCallback(std::shared_ptr<void> param) { //回调函数 } //使用fun替代onParseCallback auto fun = std::bind(&onParseCallback, placeholders::_1); //使用宏替代onPars.

随便写写 762

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

CPP11-std::function&&std::bind

cpp11中std::function以及std::bind的使用方法和配合使用

echo47377的博客 272

怎么使用std::bind

https://blog.youkuaiyun.com/u013654125/article/details/100140328 https://www.jianshu.com/p/f191e88dcc80 std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。 std::bind主要有以下两个作用: 1.将可调用对象和其参数绑定成一个防函数; 2.只绑定部分参数,减少可调用对象传入的参数。 《C++11中的std::function》中那段代码,std::functi

风再起时的博客 882

C++11 bind function

C++11标准中的std::bind和std::function是从boost中移植过来的。实践证明,还是相当好用的,同时它们可以和lamda表达式一起用。下面我们想想这样一个问题,比如我有一个类,这个类里面有一个求加法的成员函数,但是我不想在类里面实现,想交由外部实现,那么该采取什么样的策略呢 ?此时,我们通常会想到用函数指针。看下面程序。int addGlobalFun(int _a, int...

delongwang520的博客 618

[项目前置]bind的使用

讲讲C++中的std::bind

a_zhee1的博客 340

理解 std::function 和 function::bind 的用法

岁数越大越不爱接受新鲜事物,比如 c++ 11 要不是 cocos2dx 3.几的引擎在用 c++11 的特性,可能我永远也不会看. 这篇文章介绍 std::function 和 std::bind 比较清楚,转载如下. 稍微需要注意的是,当成员非静态函数有 2 个参数时候, std::bind 的参数里,需要写成 std::placeholders_1,std::placehold

杂七杂八 868

【C++中可调用对象和function】

该函数包装器模板能包装任何类型的可调用实体,如普通函数,函数对象,lamda表达式等。个人认为五种可调用对象中,函数和函数指针本质相同,而lambda表达式、bind对象及仿函数则异曲同工。bind绑定类成员函数时,第一个参数表示对象的成员函数的指针,第二个参数表示对象的地址,这是因为对象的成员函数需要有this指针。预绑定的参数是以值传递的形式,不预绑定的参数要用std::placeholders(占位符)的形式占位,从_1开始,依次递增,是以引用传递的形式;function包装仿函数。

Pass-by 386

深入应用C++11 笔记 (三)

深入应用C++11 笔记 (三) 第一章 程序简洁之道 1.5 std:function 可调用对象 是一个函数指针 是一个具有operator()成员函数的类对象(仿函数) 是一个可被转换为函数指针的类对象 是一个类成员(函数)指针 void func(void) { //... } struct Foo { void operator()(void) { //.

zt_xcyk的专栏 435

Cocos2dx游戏教程(六):“见缝插针”,菜单Menu与C++11新特性

上一节我们已经实现了第二个场景界面,最后按下按钮发现没有反应是不是,这一节将会给大家介绍下Cocos2dx另一个重要的对象,菜单Menu。 一、Menu介绍 提到Menu,不得不提到MenuItem,MenuItem继承自Node,所以它的子类菜单项都可以使用Node的相关操作。 MenuItem是所有菜单项的父类,建议不要直接使用该类,因为它并不包含具体显示的功能。 作为其它菜单项的父类,主要提...

小白的专栏 886

《C++11:function和bind》

本文介绍了C++11中的function和bind两个重要特性。function是一个类模板,用于统一包装函数指针、仿函数、lambda等可调用对象,方便类型声明和使用。bind是一个函数模板,作为函数适配器可以调整参数个数和顺序。文章通过代码示例演示了function包装各类可调用对象的方法,包括普通函数、仿函数、lambda表达式以及类成员函数。最后以LeetCode逆波兰表达式题目为例,展示了使用function优化代码的可扩展性。bind和function结合使用可以大大提高C++代码的灵活性和复用

Poeir_的博客 694

C++函数适配利器:std::bind与占位符原理、应用与陷阱详解

在C++编程中,函数适配与回调机制是构建灵活、可复用代码的核心技术。其原理在于通过参数绑定与占位符技术,将现有的可调用对象(如函数、成员函数)包装成符合新接口签名的新对象,从而实现接口的通用化适配。这项技术的核心价值在于提升代码的表达力与简洁性,避免了为简单适配而编写冗余的函数对象(Functor)。在工程实践中,它广泛应用于STL算法适配、异步回调系统、事件处理以及工厂模式等场景,例如将二元谓词适配为一元谓词供`std::find_if`使用,或将成员函数绑定为线程池任务。本文将以`std::bind`和

weixin_42524708的博客 257
上一篇: 【Redis】《Redis设计与实现》读书笔记
下一篇: 【openssl】使用openssl库进行base64加解密,aes解密,rsa验证签名
pointer_y
博客等级 码龄11年 157粉丝 107原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值