当前位置: 首页 > wzjs >正文

58重庆网站建设市场监督管理局

58重庆网站建设,市场监督管理局,网站搭建的人,辽宁省建设工程信息网网址1 概述 回调函数是一种编程模式,指的是将一个函数作为参数传递给另一个函数,并在某个特定事件发生时或满足某些条件时由该函数调用。这种机制允许你定义在特定事件发生时应执行的代码,从而实现更灵活和模块化的程序设计。 2 传统C/C回调实现…

1 概述

  • 回调函数是一种编程模式,指的是将一个函数作为参数传递给另一个函数,并在某个特定事件发生时或满足某些条件时由该函数调用。
  • 这种机制允许你定义在特定事件发生时应执行的代码,从而实现更灵活和模块化的程序设计。

2 传统C/C++回调实现方式

  • 传统C/C++实现回调,主要通过函数指针来实现。
  • 有这样一个场景,某业务系统需要检测环境温度,当温度大于50度时进行告警,告警接口就可以作为回调函数,在温度大于50度时调用。这里通过随机生成一个温度值,模式现实场景。
  • 示例
    •   #include <iostream>#include <stdlib.h>#include <time.h>// 定义函数指针typedef void(*pCb)(int);void BusProcess(int tempera, pCb cb) {printf("开始业务\n");printf("业务处理中\n");// 处理业务过程中,如果温度值大于50摄氏度,则调用告警接口进行告警if (tempera > 50) {cb(tempera);}printf("结束业务\n");}// 定义回调函数void temWarning(int tempera) {printf("温度值为: %d 已超阈值,告警 ...\n", tempera);}int main() {{srand(time(NULL));  // 随机生成温度值int tempera = rand() % 100;// 开启业务BusProcess(tempera, temWarning);}system("pause");return 0;}
      
  • 打印结果
    •   开始业务业务处理中温度值为: 65 已超阈值,告警 ...结束业务请按任意键继续. . .
      

3 C++11提供的回调新实现方式

  • 介绍C++11实现回调前先介绍C++11提供的两个新接口std::functionstd::bind

3.1 std::function

  • std::function是一个通用的函数包装器,可以存储任何可调用对象,包括普通函数、类成员函数、仿函数、Lambda表示式。
  • 基本语法
    •   #include <functional>std::function<返回值类型(参数类型列表)> 函数对象;
      
  • 示例
    •   #include <iostream>#include <functional>// 普通函数int add(int a, int b) {return a + b;}class Multiply {public:int operator()(int a, int b) {return a * b;}};int main() {// 存储普通函数std::function<int(int, int)> func1 = add;std::cout << "func1 result: " << func1(3, 4) << std::endl;// 存储 Lambda 表达式std::function<int(int, int)> func2 = [](int a, int b) { return a - b; };std::cout << "func2 result: " << func2(10, 3) << std::endl;// 存储函数对象Multiply multiply;std::function<int(int, int)> func3 = multiply;std::cout << "func3 result: " << func3(5, 6) << std::endl;return 0;}
      

3.2 std::bind

  • std::bind是一个函数模板,用于将函数或成员函数与其参数绑定,生成一个新的可调用对象。
  • 基本语法
    •   // 绑定非类成员函数/变量auto f = std::bind(可调用对象地址, 绑定的参数/占位符);// 绑定类成员函/变量auto f = std::bind(类函数/成员地址, 类实例对象地址, 绑定的参数/占位符);
      
  • 示例
    •   #include <iostream>#include <functional>int add(int a, int b) {return a + b;}class MyClass {public:int multiply(int a, int b) {return a * b;}};int main() {// 绑定普通函数auto boundAdd = std::bind(add, std::placeholders::_1, std::placeholders::_2);std::cout << "Result: " << boundAdd(5, 10) << std::endl; // 输出 15MyClass obj;// 绑定类成员函数auto boundMultiply = std::bind(&MyClass::multiply, &obj, std::placeholders::_1, std::placeholders::_2);std::cout << "Result: " << boundMultiply(3, 4) << std::endl; // 输出 12system("pause");return 0;}
      

3.3 C++11实现回调

  • 介绍完std::functionstd::bind再看下如何使用C++11语法实现回调。

  • 回调函数为普通函数时示例

    •   #include <iostream>#include <stdlib.h>#include <time.h>#include <functional>void BusProcess(int tempera, std::function<void(int)> op) {printf("开始业务\n");printf("业务处理中\n");// 处理业务过程中,如果温度值大于50摄氏度,则调用告警接口进行告警if (tempera > 50) {op(tempera);}printf("结束业务\n");}void temWarning(int tempera) {printf("温度值为: %d 已超阈值,告警 ...\n", tempera);}int main() {{srand(time(NULL));  // 随机生成温度值int tempera = rand() % 100;// 开启业务,调用对象为普通函数BusProcess(tempera, temWarning);}system("pause");return 0;}
      
  • 打印结果

    •   开始业务业务处理中温度值为: 56 已超阈值,告警 ...结束业务请按任意键继续. . .
      
  • 回调函数为类成员对象、函数对象、Lambda时示例

    •   #include <iostream>#include <stdlib.h>#include <time.h>#include <functional>void BusProcess(int tempera, std::function<void(int)> op) {printf("开始业务\n");printf("业务处理中\n");// 处理业务过程中,如果温度值大于50摄氏度,则调用告警接口进行告警if (tempera > 50) {op(tempera);}printf("结束业务\n");}class MyWarn {public:void startWarning(int tempera) {printf("温度值为: %d 已超阈值,告警 ...\n", tempera);}void operator()(int tempera) {printf("operator() 温度值为: %d 已超阈值,告警 ...\n", tempera);}};int main() {{srand(time(NULL));// 随机生成温度值int tempera = rand() % 100;MyWarn mwarn;std::function<void(int)> fc = std::bind(&MyWarn::startWarning, &mwarn, std::placeholders::_1);// 调用对象为类成员函数BusProcess(tempera, fc);MyWarn mwarn2;std::function<void(int)> fc2 = mwarn2;// 调用对象为仿函数BusProcess(tempera, fc2);// 调用对象为Lambda表达式BusProcess(tempera, [](int te) {printf("Lambda 温度值为: %d 已超阈值,告警 ...\n", te);});}system("pause");return 0;}
      
  • 打印结果

    •   开始业务业务处理中温度值为: 66 已超阈值,告警 ...结束业务开始业务业务处理中operator() 温度值为: 66 已超阈值,告警 ...结束业务开始业务业务处理中Lambda 温度值为: 66 已超阈值,告警 ...结束业务请按任意键继续. . .
      
  • class MyWarn {public:void startWarning(int tempera) {printf("温度值为: %d 已超阈值,告警 ...\n", tempera);}};#include <iostream>#include <string>#include <vector>#include <stdlib.h>#include <time.h>#include <functional>class myPersion {public:myPersion(): mCode(1001), mName("Jack") {}void setCode(int code) {std::cout << "code: " << code << std::endl;mCode = code;}private:int mCode;std::string mName;};typedef void(*pCb)(int);void optFunc(int data, pCb cb) {printf("optFunc ...\n");if (data % 2 == 0) {cb(data);}}void optFunc2(int data, std::function<void(int)> op) {printf("optFunc2 ...\n");if (data % 2 == 0) {op(data);}}void onHandle(int data) {printf("onHandle ...\n");}int main() {{srand(time(NULL));  // 初始化随机数生成器int radNum = rand() % 100;printf("radNum: %d\n", radNum);optFunc(radNum, onHandle);myPersion mp;//optFunc(1001, &mp.setCode);}{srand(time(NULL));  // 初始化随机数生成器int radNum = rand() % 100;printf("radNum: %d\n", radNum);optFunc2(radNum, onHandle);optFunc2(radNum, [](int x) {printf("lam ...\n");});myPersion mp;std::function<void(int)> fc = std::bind(&myPersion::setCode, &mp, std::placeholders::_1);optFunc2(10010, fc);}system("pause");return 0;}
    
http://www.dtcms.com/wzjs/433317.html

相关文章:

  • 公司 网站 方案推广策划方案范文
  • 在网站做专题app怎么推广运营
  • 怎么做网站推广电话国际新闻消息
  • java做网站开发的流程用html制作淘宝网页
  • 如何做动态网站html关键词seo排名优化推荐
  • 网站建设的维护工作有哪些seo最新技巧
  • 做网站的费用计入什么费用做seo需要用到什么软件
  • 手机app可以做网站吗怎样打小广告最有效
  • 网站开发工程师的职责seo的理解
  • 建站公司如何在抖音平台开店深圳网络优化公司
  • 自己做免费的网站吗哈尔滨网络推广
  • 保定建站服务搜索引擎优化 简历
  • 微网站二级页面怎么做网络营销案例及分析
  • 建立网站 用英语集客营销软件官方网站
  • 网站广告联盟怎么做的一般网络推广应该怎么做
  • 智恒企业网站管理系统淘客推广
  • 淘宝做短视频网站好微信朋友圈软文大全
  • 外贸网站建设公司效果广州竞价托管代运营
  • 做网站网页排版错误cps推广
  • 网店网站怎么做的外贸推广平台有哪几个
  • flash网站的制作网站推广方式有哪些
  • 景德镇网站建设公司沈阳网站优化
  • 欧美做愛网站A级百度拍照搜索
  • 国外购物网站排行榜网站怎么做谷歌推广
  • 舟山论坛网站建设广州优化疫情防控举措
  • 360网站页面的工具栏怎么做互联网企业营销策略
  • wordpress外部链接seo推广技术培训
  • 用腾讯云做会员网站谷歌商店官网下载
  • 如何得到网站后台权限市场营销课程
  • 做注册会计师网站百度广告标识