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

news2024/11/16 2:17:13

简介: 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;
}

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

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

相关文章

边写代码边学习之卷积神经网络CNN

1. 卷积神经网络CNN 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种深度学习神经网络的架构&#xff0c;主要用于图像识别、图像分类和计算机视觉等任务。它是由多层神经元组成的神经网络&#xff0c;其中包含卷积层、池化层和全连接…

算法与数据结构-二分查找

文章目录 什么是二分查找二分查找的时间复杂度二分查找的代码实现简单实现&#xff1a;不重复有序数组查找目标值变体实现&#xff1a;查找第一个值等于给定值的元素变体实现&#xff1a;查找最后一个值等于给定值的元素变体实现&#xff1a;查找最后一个小于给定值的元素变体实…

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU2

KPU的基础架构 让我们回顾下经典神经网络的基础运算操作&#xff1a; 卷积&#xff08;Convolution&#xff09;:1x1卷积&#xff0c;3x3卷积&#xff0c;5x5及更高的卷积 批归一化&#xff08;Batch Normalization&#xff09; 激活&#xff08;Activate&#xff09; 池化&…

玩一玩编程式 AOP

[toc] 平时我们项目中涉及到 AOP&#xff0c;基本上就是声明式配置一下就行了&#xff0c;无论是基于 XML 的配置还是基于 Java 代码的配置&#xff0c;都是简单配置即可使用。声明式配置有一个好处就是对源代码的侵入小甚至是零侵入。不过今天松哥要和小伙伴们聊一聊编程式的 …

Chapter 9: Lists | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介ListsA list is a sequenceLists are mutableTraversing a listList operationsList slicesList methodsDeleting elementsLists and functionsLists and stringsParsing linesObjects and valuesAliasingList argumentsDebuggingGlossar…

【Spring】Spring 下载及其 jar 包

根据 【动力节点】最新Spring框架教程&#xff0c;全网首套Spring6教程&#xff0c;跟老杜从零学spring入门到高级 以及老杜的原版笔记 https://www.yuque.com/docs/share/866abad4-7106-45e7-afcd-245a733b073f?# 《Spring6》 进行整理&#xff0c; 文档密码&#xff1a;mg9b…

数字签名与数字证书

数字签名与数字证书 数字签名数字证书数字证书的原理数字证书的特点 如何验证证书机构的公钥不是伪造的 数字签名 数字签名是非对称密钥加密技术与数字摘要技术的应用&#xff0c;数字签名就是用加密算法加密报文文本的摘要&#xff08;摘要通过hash函数得到&#xff09;而生成…

「回溯框架」

文章目录 0 回溯和动态规划&#xff08;dp&#xff09;的区别0.1 框架 1 刷题1.1 全排列1.1.1 题解1.1.2 Code1.1.3 结果 1.2 N皇后1.2.1 题解1.2.2 Code1.2.3 结果 0 回溯和动态规划&#xff08;dp&#xff09;的区别 动态规划的核心是穷举&#xff0c;那么回溯算法和dp有什么…

单机最快的队列Disruptor解析和使用

前言 介绍高性能队列Disruptor原理以及使用例子。 Disruptor是什么? Disruptor是外汇和加密货币交易所运营商 LMAX group 建立高性能的金融交易所的结果。用于解决生产者、消费者及其数据存储的设计问题的高性能队列实现。可以对标JDK中的ArrayBlockingQueue。是目前单机且…

IDC报告背后:大模型时代,重新理解AI公有云

大模型之于AI公有云的意义&#xff0c;在于大模型可以改变过去“手工作坊定制算法”的高成本模式&#xff0c;转向“工厂模式”&#xff0c;只需要微调和精调&#xff0c;就可以形成针对性的场景算法。 作者|葛覃 出品|产业家 一年前&#xff0c;依然有不少云计算从业者思…

基于智能状态和源代码插桩的 C 程序内存安全性动态分析

原文来自微信公众号“编程语言Lab”&#xff1a;基于智能状态和源代码插桩的 C 程序内存安全性动态分析 搜索关注“编程语言Lab”公众号&#xff08;HW-PLLab&#xff09;获取更多技术内容&#xff01; 欢迎加入 编程语言社区 SIG-程序分析 参与交流讨论&#xff08;加入方式&a…

警惕!通过谷歌和必应搜索广告传播的新型恶意活动

据观察&#xff0c;一种新的恶意广告活动利用谷歌搜索和必应的广告&#xff0c;以AnyDesk、Cisco AnyConnect VPN和WinSCP等IT工具的用户为目标&#xff0c;诱骗他们下载木马安装程序&#xff0c;目的是入侵企业网络&#xff0c;并可能在未来实施勒索软件攻击。 Sophos在周三的…

Python生成pyc以及pyd文件的方法

文章目录 0. 背景1. pyc文件的生成2. pyd文件的生成3. 两者的异同 0. 背景 当有些模块的代码需要一定的保密性&#xff0c;这个时候就需要考虑pyc和pyd文件了。今天就好好琢磨一下这两种文件的生成和使用方法。让自己的知识能够朝着商业化的方向再前进一步。 1. pyc文件的生成…

为企业发展赋能增效:中国智能交通协会来访闪马智能

7月26日&#xff0c;中国智能交通协会秘书长杨颖一行来访闪马智能&#xff0c;闪马智能助理总裁兼营销与方案中心总经理黄智宏、CMO王一佳、副总裁詹诚以及副总裁兼智慧城市创新院院长邵钦豪等出席了交流会。 上海电科智能系统股份有限公司、卡斯柯信号有限公司、上海澳星照明电…

告别胆怯,大步向前,迎接新挑战!

告别胆怯&#xff0c;大步向前&#xff0c;迎接新挑战&#xff01; “赤日炎炎似火烧&#xff0c;野田禾稻半枯焦。农夫心内如汤煮。公子王孙把扇摇。”读罢《水浒传》中的这一首七绝诗&#xff0c;受其感染&#xff0c;笔者也乘兴呤顺口溜四句抒怀&#xff1a;“烈日炎炎似火…

FlatBuffers 使用编译器

1、前言 可能刚接触的人会思考为啥要使用编译器&#xff1a; 一般跨平台、跨语言的都有一套固定的流程&#xff0c;大致可分为&#xff1a; 撰写IDL文件 -> 使用对应语言的编译器&#xff0c;编译成对应的语言 -> 序列化 ->持久化 -> 反序列化 这里就对应着这个…

Spring中IOC容器常用的接口和具体的实现类

在Spring框架没有出现之前&#xff0c;在Java语言中&#xff0c;程序员们创建对象一般都是通过关键字new来完成&#xff0c;那时流行一句话“万物即可new&#xff0c;包括女朋友”。但是这种创建对象的方式维护成本很高&#xff0c;而且对于类之间的相互关联关系很不友好。鉴于…

三言两语说透关于 MySQL2 和 MySQL 的区别

MySQL是最流行的开源关系型数据库管理系统,拥有大量的使用者和广泛的应用场景。而MySQL2是MySQL官方团队推出的新一代MySQL驱动&#xff0c;用于取代老版的MySQL模块&#xff0c;提供更好的性能和更丰富的功能。本文将介绍MySQL2相较于MySQL有哪些优势以及具体的技术区别。 My…

01 关于 ABAP RAP 模型

ABAP RAP 模型 概览 关于 RAP 专栏内容&#xff0c;是个人在 SAP 官方提供的课程学习后整理的文档。这些文档涉及部分对概念的理解。在这里&#xff0c;不做具体讲解&#xff0c;而是跟随后续实例开发教程&#xff0c;通过实际练习&#xff0c;让大家能够理解这些概念。 ABAP …

【Linux】多线程——生产者和消费者模型

目录 1 生活中的例子 2 为何要使用生产者消费者模型 3 生产者和消费者模型的特点 优点 4 如何理解生产消费模型提高了效率&#xff1f; 5 基于BlockingQueue(阻塞队列)的生产者消费者模型 C queue模拟阻塞队列的生产消费模型 1 生活中的例子 存在多个消费者&#xff0c…