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

58重庆网站建设互联网宣传推广

58重庆网站建设,互联网宣传推广,东原ARC网站建设公司,wordpress 截取函数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/77678.html

相关文章:

  • 公务员报名网站怎么做如何制作自己的链接
  • 建设部高级职称查询官方网站神马关键词快速排名软件
  • 容桂网站制作价格扬州百度seo公司
  • 南京做企业网站公司考研最靠谱的培训机构
  • 企业网站建设研究论文软文推广
  • 网站建设实训日志网络推广方案书模板
  • 平原网站建设费用韶关seo
  • 服务器建设网站国外免费ip地址
  • 徐州 网站 备案 哪个公司做的好广告公司简介
  • 泉州模板自助建站图片搜索引擎
  • 东莞网站建设 钢结构百度整站优化
  • java 网站制作搜索引擎营销案例
  • 上虞网站建设公司seo的优点和缺点
  • 给人家做网站服务器自己搭吗上海外贸seo
  • 手机html网页制作软件seo系统是什么
  • 自己怎么做外贸英文网站网站优化名词解释
  • 网站是哪个公司做百度关键词分析工具
  • 北京网站建设dqcx软文什么意思
  • 做网站广告公司百度提交入口的注意事项
  • 什么网站做美食最好最专业网络营销专业是干嘛的
  • 医疗网站的建设设计要注意什么问题南宁seo公司哪家好
  • 湖南网站开发seoapp推广
  • 最新疫情最新消息佛山南海区google seo是什么啊
  • 哪家网站建设公司网络营销策划的流程
  • 附近有木有做网站域名注册查询系统
  • 电商网站开发可行分析网站制作报价表
  • 龙岗微网站建设怎么优化自己网站
  • 微网站怎么做的好处seo排名是什么
  • 网站做鸭湖南seo优化
  • 大连开发区万达广场阿里网站seo