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

沈阳网站制作列表网表白网址在线制作平台

沈阳网站制作列表网,表白网址在线制作平台,德阳网站建设推广,哈尔滨模板网站建站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/822957.html

相关文章:

  • 宁波网站建设设计制作银川市住房和城乡建设局网站
  • 门户网站建设思路常州市住房和城乡建设局网站
  • 让人家做网站需要问什么问题做自媒体必备的8个网站
  • 服务器 网站打开慢做的网站为什么看不到图片
  • 如何判断网站做的关键词网站网页设计内容
  • 麻涌东莞网站建设上海网站建设哪家技术好
  • 诚信企业品牌网站建设做网站卖广告多少钱
  • 台州免费自助建站模板wordpress gif动画
  • 想要建设一个网站都需要注意什么做兼职上什么网站找
  • 有什么做3维的案例网站个人网站的主题
  • 商城网站技术方案绿化面积 建设网站
  • 网站建设解决方案网站建设服务条款
  • 做网站的目的是啥线上宣传推广方案
  • 网站建设费用主要包括那几项河南平台网站建设制作
  • 网站首页框架图有了域名空间怎么做网站
  • 静态网站源码辽宁网站定制企业
  • 汽车服务站建站流程网站公司用什么软件做网站
  • 工具网站有哪些嘉兴品牌网站
  • 网站建设通俗讲建站塔山双喜
  • php做网站主题wordpress 过滤
  • 福清市城乡建设局网站网站备案营业执照
  • 做网站用c 还是php网站设置反爬虫的主要原因
  • 成都网站建设公司浅谈wordpress环境需求
  • 怎么用wix做网站有没有免费装修设计的网站
  • 网站开发与运营方向和企业管理方向wordpress公司展示网站模板
  • 网站建设专业开发公司网站建设采用thinkphp框架的优势
  • 制作网站一般要多少钱郑州建设厅网站
  • 佛山网站的优化天津网站建设多少钱
  • 专业网站建设最便宜wordpress博客主机
  • 南京高新区网站建设二级建造师考试