C++ | std::bind

news2024/10/7 8:23:32

C++ | std::bind

文章目录

  • C++ | std::bind
    • std::bind函数原型
    • bind函数参数
      • 返回对象的类型:
    • 实战
      • 1.普通函数/类成员函数/类成员变量
      • 2.模板函数
      • 3.lambda表达式
    • Reference

std::bind函数原型

// 无返回值(1)
template <class Fn, class... Args>  /* unspecified */ bind (Fn&& fn, Args&&... args);
// 有返回值(2)
template <class Ret, class Fn, class... Args>  /* unspecified */ bind (Fn&& fn, Args&&... args);

bind函数参数

fn 为绑定的函数对象,比如函数对象、函数指针、函数引用、成员函数或者数据成员函数。

args 为函数的入参列表,使用命名空间占位符std::placeholders::_1(第1个参数),std::placeholders::_2(第2个参数)等标志参数。

每个参数可以绑定到一个值或者是一个占位符:

  • 如果绑定到一个值,调用返回的函数对象将始终使用该值作为参数。
  • 如果是占位符,则调用返回的函数对象会将传递给调用的参数转发给调用(其顺序号由占位符指定的参数)。

调用返回的对象返回与 fn 相同的类型,除非将特定的返回类型指定为 Ret (2)(请注意,Ret 是唯一不能通过传递给此函数的参数隐式推导的模板参数)。

返回对象的类型:

返回一个函数对象,它的返回值与 fn 相同的结果,其参数也绑定到 args…(或转发,用于占位符)。
对如果f是指向类的成员函数,则返回函数第一个参数应该是该类的成员、或者成员对象的引用、或者是成员对象的指针。

实战

1.普通函数/类成员函数/类成员变量

#include <functional>  // std::bind
#include <iostream>    // std::cout

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

struct RandyPair {
  double randy, sesame;
  double multiply() { return randy * sesame; }
  static double Add(double lhs, double rhs) {
    return lhs + rhs;
  }
};

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

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

  auto fn_half = std::bind(randy_divide, _1, 2);  // returns x/2
  std::cout << fn_half(22) << '\n';               // 11

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

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

  RandyPair three_eleven{3, 11};

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

  auto bound_member_data =
      std::bind(&RandyPair::randy, three_eleven);  // returns ten_two.a
  std::cout << bound_member_data() << '\n';        // 3
    
   // function pointer
   RandyPair *pRandyPairPtr = new RandyPair();
  pRandyPairPtr->randy = 3.0;
  pRandyPairPtr->sesame = 8.0;
  auto bindFuncPtr = std::bind(&RandyPair::multiply, pRandyPairPtr);
  std::cout << "bindFuncPtr(): " << bindFuncPtr() << '\n'; 

   auto bindClassStaticFunc = std::bind(&RandyPair::Add, _1, _2);
  std::cout << "bindClassStaticFunc(2, 13): " << bindClassStaticFunc(2, 13) << '\n'; 
    
  return 0;
}

结果:

5
11
0.2
3
33
3
bindFuncPtr(): 24
bindClassStaticFunc(2, 13): 15

2.模板函数

#include <functional>  // std::bind
#include <iostream>    // std::cout

template <class T>
void TemplateBindFunc(T lhs, T rhs)
{
    std::cout << "模板函数被调用, lhs = " << lhs << ", rhs = " << rhs << std::endl;
}


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

  auto templateFunc = std::bind(&TemplateBindFunc<int>, _1, _2);
  templateFunc(2, 13);
  return 0;
}

结果:

模板函数被调用, lhs = 2, rhs = 13

3.lambda表达式

#include <functional>  // std::bind
#include <iostream>    // std::cout

int main() {
  auto lamdaFunc = std::bind(
      [](int randy, int sesame "") {
        std::cout << "lambda表达式, randy = " << randy << ", sesame = " << sesame << std::endl;
      },
      std::placeholders::_1, std::placeholders::_2);
  lamdaFunc(1, 22);
  
  return 0;
}

结果:

lambda表达式, randy = 1, sesame = 22

Reference

  • C++11 - std::bind简要介绍以及可绑定函数的几种形式总结

  • 【C++11 新特性】bind(二)


欢迎关注公众号【三戒纪元】

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

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

相关文章

OpenHarmony下如何打印C/C++调用堆栈

普法OpenHarmony下如何打印C/C调用堆栈 引言 各位大姐&#xff0c;老妹&#xff0c;兄弟是否在OpenHarmony开发移植过程中有过如下烦恼呢&#xff1f;想跟踪源码探寻相关代码逻辑的时候&#xff0c;当面对代码分支逻辑太多&#xff0c;太复杂&#xff0c;打调试信息进行追踪已经…

Mach-O

看看逆向过程中&#xff0c;经常遇见的Mach-O文件类型&#xff1a; MH_OBJECT&#xff0c;这种类型的文件有目标文件(.o)、静态库文件(.a) &#xff08;静态库文件就是N个.o文件合并在一起的&#xff09; MH_EXECUTE&#xff0c;可执行文件&#xff0c;例如上面说的Super文件 …

如何选择一款好的护眼台灯给孩子用?儿童护眼台灯推荐

所以也想要分享给大家&#xff0c;那么热爱看书的你&#xff0c;是否有时候会因为光源的问题而烦恼呢&#xff1f;房间所用的大灯虽然亮度足够&#xff0c;但太过于分散的光&#xff0c;让眼睛在长期聚精会神后&#xff0c;有了红肿干涩&#xff0c;酸痛模糊的感觉。而专用的台…

界面控件DevExpress Blazor UI v22.2 - 折叠组件、数据编辑器升级增强

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具&#xff0c;该组件拥有众多新产品和数十个具有高影响力的功能&#xff0c;可为桌面、Web和移动应…

远程桌面基本原理

远程桌面基本原理 远程桌面是一种技术&#xff0c;它允许用户通过互联网或局域网远程访问另一台计算机的桌面。这种技术可以让用户在不同的地方使用同一台计算机&#xff0c;或者在同一地方使用不同的计算机。远程桌面技术在现代计算机应用中发挥着重要的作用&#xff0c;本文将…

达索的CAD绘图软件DraftSight 2023版本下载与安装配置教程

目录 前言一、​安装前准备二、DraftSight安装三、使用配置总结 前言 Dassault Systemes公司的DraftSight软件是一款功能强大的2D CAD绘图软件&#xff0c;可以帮助用户快速、准确地创建和编辑各种类型的图形。它的用户界面简单易用&#xff0c;支持多种文件格式&#xff0c;包…

C++ | function

C | function 文章目录 C | function引言实战1. 模板类声明2.普通函数/Lambda表达式/仿函数/类成员函数3.函数指针/模板函数/模板函数对象4.静态函数/类模板静态函数/模板类成员函数/类成员函数5. copy/move Reference 引言 程序设计时&#xff0c;经常需要使用回调函数&#…

多语言支持-唯一客服系统文档中心

客服系统支持多语种展示&#xff0c;比如&#xff1a;中文&#xff0c;英文&#xff0c;繁体&#xff0c;日语&#xff0c;韩语&#xff0c;俄语等&#xff0c;并且可以扩展各种小语种 语种展示的优先级 首先&#xff0c;按照url参数中指定的lang参数 其次&#xff0c;查询loca…

Open5gs学习笔记

目录 1.用户面和控制面分离 最近想在liunx模拟机上运行Open5GSUERANSIM来学习5G信令流程。 1.用户面和控制面分离 open5GS的quickstart提及By having the control and user planes physically separated like this, it means you can deploy multiple user plane servers in …

灾难恢复:支持业务连续性的策略——保证员工和客户始终可以访问关键数据和应用程序

灾难恢复&#xff1a;支持业务连续性的策略 保证员工和客户始终可以访问关键数据和应用程序。 为什么选择 NetApp 的业务连续性和灾难恢复解决方案&#xff1f; 保持弹性&#xff0c;自如操作 NetApp 就在您身边&#xff0c;在这样一个跌宕起伏的时期竭诚帮助您实现业务连续性…

一秒钟变身明星:用swapface软件体验星光熠熠的感觉!

你是否曾经想过能够用电脑或手机来实时地将自己的面部与其他人或角色进行交换&#xff1f;你是否曾经想过能够用一款简单易用的软件来制作出有趣或惊艳的面部交换直播、视频或图片&#xff1f;如果你的答案是肯定的&#xff0c;那么你一定要试试swapface软件&#xff0c;这是一…

Linux服务器内核崩溃问题分析

阿里云服务器无法使用SSH连接&#xff0c;网站访问也出现异常&#xff0c;登录阿里云平台&#xff0c;系统提示&#xff1a;系统出现了内核Panic&#xff0c;OOM异常或内部宕机、性能抖动。后台询问了阿里云客服&#xff0c;说需要安装和开kdump 服务&#xff0c;于是开始了kdu…

九耶丨阁瑞钛伦特-springcloud(八)

SpringCloud体系结构是一个基于Spring框架的云原生微服务架构。它具有高可用性、高可扩展性、低时延和高安全性等特点&#xff0c;能够帮助企业构建高效、快速、安全、可靠的微服务体系架构&#xff0c;并支持跨云供应商和私有数据中心的部署。 SpringCloud体系结构的核…

2023 年第八届数维杯数学建模挑战赛 赛题浅析

为了更好地让大家本次数维杯比赛选题&#xff0c;我将对本次比赛的题目进行简要浅析。本次比赛的选题中&#xff0c;研究生、本科组请从A、B题中任选一个 完成答卷&#xff0c;专科组请从B、C题中任选一个完成答卷。这也暗示了本次比赛的难度为A>B>C 选题人数初步估计也…

windows网络常用命令,须熟记。

目录&#xff1a; 常用网络命令&#xff08;一&#xff09;-- ping操作 常用网络命令&#xff08;二&#xff09;-- IPConfig操作 常用网络命令&#xff08;三&#xff09;-- netstat 命令 和 tracert 命令 常用网络命令&#xff08;四&#xff09;-- route 命令 和 arp 命令 常…

视频国标GB28181及一个相关平台的应用

一、国标GB28181 1、概述 所谓国标GB28181&#xff0c;是我国制订的一项视频流接入协议。好处是&#xff0c;只要摄像头支持该项协议&#xff0c;那么无论是海康还是大华&#xff0c;或者别的什么摄像头&#xff0c;都能接入一个支持该协议的媒体平台&#xff0c;达到无缝集成…

USB Type-C接口会成为显示器行业的下个风口吗?

最近市场上开始陆续涌现配有USB-C接口的显示器&#xff0c;很多小伙伴并不知道这接口是什么用途。除一些老旧设备使用VGA外&#xff0c;目前显示器常用接口不外乎HDMI、DP、DVI这几种&#xff0c;但很多人并不知道&#xff0c;USB-C也是显示器接口之一。 为什么选择 USB-C&…

ubuntu下vlan使用配置

文章目录 一&#xff1a;什么是vlan1 &#xff1a;为什么使用vlan 二&#xff1a;ubuntu下vlan配置1: ubuntu启用配置vlan前的准备2&#xff1a;ip命令添加配置网卡3&#xff1a;vlan相关命令配置4&#xff1a;ubuntu 20.04 通过netplan配置及持久化5&#xff1a;ubuntu 18.04 …

linux环境安装使用jdk详解

01-安装JDK 1.1 下载jdk压缩包 下载地址&#xff1a; Oracle Access Manager Operation Error Java Downloads | Oracle 下载完成之后上传到服务器 # 1.将JDK解压缩到指定目录 tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/ 注意:-C参数是将JDK解压之后文件放入usr目录中 # 2…

第43讲: Python使用map和filter函数遍历可迭代对象

文章目录 1.遍历迭代对map和filter函数的区别2.使用map函数对可迭代对象进行遍历3.使用filter函数对可迭代对象进行遍历 1.遍历迭代对map和filter函数的区别 map和filter这两个函数都可以根据指定的另外一个函数&#xff0c;从而对指定的可迭代对象&#xff08;列表、字符串、…