C++之普通函数指针/类成员函数指针/lambda回调函数总结(一百六十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之普通函数指针和类成员函数指针总结

2.应用实例

#include <iostream>
#include <string>
#include <stdio.h>
#include <functional>
using namespace std;
//一、普通函数回调
//1.返回类型:int; 参数类型(int, int).
int get_data(int x, int y){
  return x+y;
}

//v1.0
int (*callback)(int x, int y);

//v2.0 typedef
typedef int (*TCallBack)(int x, int y);

//v3.0 using
using UCall = int (*)(int x, int y);

//二、类成员函数回调
class ICameraService{
public:
  //1.返回类型:int; 参数类型(int, string buf).
  int test(int a, string buf){
    printf("xxx----------%s(), line = %d, a = %d, buf = %s\n",__FUNCTION__,__LINE__,a,buf.c_str());
    return a;
  }
};

//三、lambda表达式函数回调
int lambda_test(std::function<void(const std::string& desc)> _hidl_cb){
  _hidl_cb("AAAAAAAAAAAAAAAAAAAAAAAA");
  return 12;
}

int main(void){
  //一、普通函数回调
  //v1.0
  callback = get_data;
  printf("line = %d, sum = %d\n", __LINE__,callback(1, 3));

  //v2.0 typedef:定义普通函数指针
  TCallBack tcall;
  tcall = get_data;
  printf("line = %d, sum = %d\n", __LINE__,tcall(10, 30));


  //v3.0 using:定义普通函数指针
  UCall ucall = get_data;
  printf("line = %d, sum = %d\n", __LINE__,ucall(10, 300));

  //v4.0 function + bind:定义普通函数指针
  function<int (int, int)> ft01 = bind(get_data, std::placeholders::_1, std::placeholders::_2);
  printf("line = %d, sum = %d\n", __LINE__,ft01(12, 400));

  //v5.0 atuo + bind:定义普通函数指针
  auto ft02 = bind(get_data, std::placeholders::_1, std::placeholders::_2);
  printf("line = %d, sum = %d\n", __LINE__,ft02(13, 500));
  printf("----------------------------------------------------------------\n\n");
  //二、ICameraService类成员函数回调
  //v1.0 typedef:定义类成员函数指针
  //定义ICameraService类的成员函数的类型TCamCallback,即函数指针的类型为TCamCallback.
  typedef int (ICameraService::*TCamCallback)(int a, string buf);
  TCamCallback tcb;//定义成员函数指针
  //设置回调函数初始化,将成员函数test的地址赋值给函数指针tcb
  tcb = &ICameraService::test;
  ICameraService cam01;//定义ICameraService对象cam01
  (cam01.*tcb)(10, "1111111");
  //或者
  //ICameraService *cam01 = new ICameraService;//定义ICameraService对象cam01
  //(cam01->*tcb)(10, "1111111");

  //v2.0 using:定义类成员函数指针
  using UCamCallback = int (ICameraService::*)(int a, string buf);
  UCamCallback ucb;
  ucb = &ICameraService::test;
  ICameraService cam02;
  (cam02.*ucb)(11, "2222222");

  //v3.0 function + bind:定义类成员函数指针
  ICameraService cam03;
  function<int (int, string)> fb01 = bind(&ICameraService::test, &cam03, std::placeholders::_1, std::placeholders::_2);
  fb01(12, "3333333");

  //v4.0 auto + bind:定义类成员函数指针
  ICameraService cam04;
  auto at01 = bind<int>(&ICameraService::test, &cam04, std::placeholders::_1, std::placeholders::_2);
  at01(13,"4444444");
  printf("----------------------------------------------------------------\n\n");
  //三、lambda表达式函数回调
  //v1.0 直接使用:function + lambda:定义普通函数指针
  int aa  = 10;
  function<int (int, int)> ft03 =[&aa](int a, int b) -> int {
    return a + b + aa;
  };
  printf("line = %d, sum = %d\n", __LINE__,ft03(10,10));

  //v2.0 直接使用:auto + lambda:定义普通函数指针
  int bb  = 100;
  auto ft04 =[&bb](int a, int b) -> int {
    return a + b + bb;
  };
  printf("line = %d, sum = %d\n", __LINE__,ft04(20,20));

  //v3.0 传参的方式:lambda直接回调
  int cc = 1000;
  lambda_test([&cc](string buf)->int{
    printf("line = %d, buf = %s\n", __LINE__,buf.c_str());
    return cc;
  });

  return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Go 语言入门指南:基础语法和常用特性解析

文章目录 Hello,World变量、指针及赋值变量和常量指针赋值 选择和循环选择循环 基本数据类型整型整型的取值范围 运算符二元运算符一元运算符 浮点型复数和布尔类型 字符串runeUnicode和UTF-8按字节访问按字符rune访问特点 数组数组的定义1. 使用默认初始值2. 定义并初始化3. 省…

13.4.2 【Linux】sudo

相对于 su 需要了解新切换的使用者密码 &#xff08;常常是需要 root 的密码&#xff09;&#xff0c; sudo 的执行则仅需要自己的密码即可。sudo 可以让你以其他用户的身份执行指令 &#xff08;通常是使用 root 的身份来执行指令&#xff09;&#xff0c;因此并非所有人都能够…

Verilog语法学习——LV1_四选一多路器

LV1_四选一多路器 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 制作一个四选一的多路选择器&#xff0c;要求输出定义上为线网类型 状态转换&#xff1a;…

将Parasoft和ChatGPT相结合会如何?

ChatGPT是2023年最热门的话题之一&#xff0c;是OpenAI训练的语言模型。它能够理解和生成自然语言文本&#xff0c;并接受过大量数据的训练&#xff0c;包括用各种编程语言编写的许多开源项目的源代码。 软件开发人员可以利用大量的知识库来协助他们的工作&#xff0c;因为它具…

迁移学习、微调、计算机视觉理论(第十一次组会ppt)

@TOC 数据增广 迁移学习 微调 目标检测和边界框 区域卷积神经网络R—CNN

Kafka-配置Kerberos安全认证(JDK8、JDK11)

一、相关配置 1、JAAS 配置文件 KafkaClient {com.sun.security.auth.module.Krb5LoginModule requireduseKeyTabtruestoreKeytrueserviceName"kafka"keyTab"D:/code/demo/conf/kafka.service.keytab"principal"kafka/hdp-1"; }; 2、keytab 文…

3d软件动物生活习性仿真互动教学有哪些优势

软体动物是一类广泛存在于海洋和淡水环境中的生物&#xff0c;其独特的形态和生活习性给学生带来了新奇和有趣的学习主题&#xff0c;为了方便相关专业学科日常授课教学&#xff0c;web3d开发公司深圳华锐视点基于真实的软体动物&#xff0c;制作软体动物3D虚拟展示系统&#x…

在CSDN学Golang云原生(Kubernetes声明式资源管理Kustomize)

一&#xff0c;生成资源 在 Kubernetes 中&#xff0c;我们可以通过 YAML 或 JSON 文件来定义和创建各种资源对象&#xff0c;例如 Pod、Service、Deployment 等。下面是一个简单的 YAML 文件示例&#xff0c;用于创建一个 Nginx Pod&#xff1a; apiVersion: v1 kind: Pod m…

瓦瑟斯坦距离、收缩映射和现代RL理论

Wasserstein Distance, Contraction Mapping, and Modern RL Theory | by Kowshik chilamkurthy | Medium 一、说明 数学家们在考虑一些应用的情况下探索的概念和关系 - 几十年后成为他们最初从未想象过的问题的意想不到的解决方案。 黎曼的几何学只是出于纯粹的原因才被发现的…

动静态网页、Django创建表关系、Django框架的请求生命周期流程图

一、request对象的几个方法 在视图函数中写方法的时候&#xff0c;都会有一个形参requestdef index(request):passrequest.method # GET POST request.GET.get() # 它获取最后一个元素值 request.GET.getlist() # 获取到所有的request.POST.get() # 它获取最后一个元素值 req…

哈工大计算机网络课程局域网详解之:无线局域网

哈工大计算机网络课程局域网详解之&#xff1a;无线局域网 文章目录 哈工大计算机网络课程局域网详解之&#xff1a;无线局域网IEEE 802.11无线局域网802.11体系结构802.11&#xff1a;信道与AP关联 本节介绍一下平时经常使用的一个无线局域网技术&#xff0c;也就是通常我们使…

Vue2基础五、工程化开发

零、文章目录 Vue2基础五、工程化开发 1、工程化开发和脚手架 &#xff08;1&#xff09;开发 Vue 的两种方式 核心包传统开发模式&#xff1a;基于 html / css / js 文件&#xff0c;直接引入核心包&#xff0c;开发 Vue。工程化开发模式&#xff1a;基于构建工具&#xf…

CSS Flex 笔记

1. Flexbox 术语 Flex 容器可以是<div> 等&#xff0c;对其设置属性&#xff1a;display: flex, justify-content 是沿主轴方向调整元素&#xff0c;align-items 是沿交叉轴对齐元素。 2. Cheatsheet 2.1 设置 Flex 容器&#xff0c;加粗的属性为默认值 2.1.1 align-it…

Windows 找不到文件‘chrome‘。请确定文件名是否正确后,再试一次

爱像时间&#xff0c;永恒不变而又短暂&#xff1b;爱像流水&#xff0c;浩瀚壮阔却又普普通通。 Windows 找不到文件chrome。请确定文件名是否正确后&#xff0c;再试一次 如果 Windows 提示找不到文件 "chrome"&#xff0c;可能是由于以下几种原因导致的&#xff1…

Unity下如何实现低延迟的全景RTMP|RTSP流渲染

技术背景 Unity3D可以用于创建各种类型的的应用程序&#xff0c;包括虚拟现实、培训模拟器等。以下是一些可以使用Unity3D全景播放的场景&#xff1a; 虚拟现实体验&#xff1a;全景视频可以用来创建逼真的虚拟环境&#xff0c;使用户能够感受到身临其境的感觉&#xff1b;培…

LeetCode|backtracking|review:40. 131. 93. 47. 332. | 37. Sudoku Solver

复习&#xff1a; 40. Combination Sum II [1,1,2,3]中&#xff0c;答案里有[1,1,2], 但是不能有两个[1,2,3] 131. Palindrome Partitioning 每个for都是在给定的start之后找一个palindrome。当start 93. Restore IP Addresses forloop每次loop都是在给定的start的后三个数…

干货 | 5个经典的模拟电路解析,电子人必看!

干货 | 5个经典的模拟电路解析&#xff0c;电子人必看&#xff01; 作为一个电子人&#xff0c;我们平时需要和不同的电路接触&#xff0c;但有一些电路图是经典的&#xff0c;值得我们永远记住。一、自举电路 此电路用在各种ADC之前的采样电路&#xff0c;可以让ADC实现轨到轨…

给APK签名—两种方式(flutter android 安装包)

前提&#xff1a;给未签名的apk签名&#xff0c;可以先检查下apk有没有签名 通过命令行查看&#xff1a;打开终端或命令行界面&#xff0c;导入包含APK文件的目录&#xff0c;并执行以下命令&#xff1a; keytool -printcert -jarfile your_app.apk 将 your_app.apk替换为要检查…

《2023中国开发者调查报告》探索2023中国开发者的技术创新与挑战:AIoT、云原生、国产数据库等领域的发展与前景

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

[论文阅读笔记24]Social-STGCNN: A Social Spatio-Temporal GCNN for Human Traj. Pred.

论文: 论文地址 代码: 代码地址 作者在这篇文章中直接用GNN对目标的轨迹时空特征进行建模, 并用时序CNN进行预测, 代替了训练难度较大和速度较慢的RNN类方法. 0. Abstract 行人轨迹预测是一个比较有挑战性的任务, 有着许多的应用. 一个行人的轨迹不仅是由自己决定的, 而且受…