使用std::function 来实现回调函数、委托的功能

这篇具有很好参考价值的文章主要介绍了使用std::function 来实现回调函数、委托的功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

std::function 可以用来实现回调函数和委托的功能。下面是一个回调函数的示例:

#include <iostream>
#include <functional>

void printText(const char* text) {
    std::cout << "The text is: " << text << std::endl;
}

void processText(const char* text, const std::function<void(const char*)>& callback) {
    std::cout << "Processing the text..." << std::endl;
    callback(text);
}

int main() {
    // 将回调函数 printText 传递给 processText,当 processText 处理完文本后会调用回调函数
    processText("Hello, world!", printText);
    return 0;
}

在上述示例中,我们定义了回调函数 printText,这个函数接受一个字符型指针参数,并打印出这个字符串。然后,我们定义了函数 processText,该函数接受两个参数:文本和一个 std::function 类型的对象,这个对象将用作回调函数。在函数的实现中,我们打印出一条简单的消息,然后调用传递进来的回调函数,并传递给它文本参数。

在主函数中,我们将回调函数 printText 传递给 processText 函数,当 processText 处理完文本后,会调用这个回调函数并输出文本。您可以根据需要更改回调函数和其它参数,但这个示例演示了如何使用 std::function 实现一个非常基本的回调函数。

同时,std::function 也可以用来实现委托功能。在C#语言中,委托(Delagate)可以看做函数指针的更高级抽象,它允许方法的选择器(Selector)与特定类型安全签名相匹配的方法进行关联,从而实现动态调用、反射、事件等功能。下面是一个使用 std::function 实现委托的简单示例:

#include <iostream>
#include <functional>

class Person {
public:
    typedef std::function<int(int, int)> CalculateFunc;

    Person(const std::string& name) : name_(name) {}

    void setCalculateFunc(CalculateFunc func) {
        calculateFunc_ = func;
    }

    int calculate(int a, int b) {
        return calculateFunc_(a, b);
    }

private:
    std::string name_;
    CalculateFunc calculateFunc_;
};

int add(int a, int b) {
    std::cout << "Add " << a << " and " << b << std::endl;
    return a + b;
}

int subtract(int a, int b) {
    std::cout << "Subtract " << a << " and " << b << std::endl;
    return a - b;
}

int main() {
    Person p("Alen");

    // 使用 add 函数作为委托
    p.setCalculateFunc(add);
    std::cout << "Result: " << p.calculate(3, 4) << std::endl;

    // 使用 subtract 函数作为委托
    p.setCalculateFunc(subtract);
    std::cout << "Result: " << p.calculate(3, 4) << std::endl;

    return 0;
}

在上述示例中,我们定义了一个 Person 类,它具有一个名为 CalculateFunc 的公共类型别名(typedef)。该类型表示一个接收两个整数参数并返回一个整数结果的函数指针或函数对象。然后,我们定义了两个函数 addsubtract,它们都满足 CalculateFunc 的要求。

在主函数中,我们创建了一个 Person 对象,并使用 setCalculateFunc 函数将 add 函数设置为其委托。然后,我们调用 calculate 函数,并输出计算结果。接着,我们又将 subtract 函数设置为其委托,再次调用 calculate 函数,并输出计算结果。

可以看到,通过使用 std::function 来实现委托,我们可以将不同的函数作为可选项传递给一个类的方法,从而实现动态选项。当然,这只是一个简单的示例,实际上委托可以实现更复杂的功能,例如事件、反射等。文章来源地址https://www.toymoban.com/news/detail-493680.html

到了这里,关于使用std::function 来实现回调函数、委托的功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 64位下使用回调函数实现监控

    在32位的系统下,我们想要实现某些监控十分简单,只需要找到对应的API实现挂钩操作即可检测进程。但在64位系统下随着 Patch Guard 的引入,导致我们如果继续使用挂钩API的方式进行监控会出现不可控的情况发生。微软也考虑到了用户程序的开发,所以开放了方便用户调用的

    2024年02月16日
    浏览(24)
  • 使用Spring Boot实现Redis键过期回调功能

    当使用Redis作为缓存或数据存储的时候,有时候需要在键过期时执行一些特定的操作,比如清除相关数据或发送通知。在Spring Boot中,可以通过实现 RedisMessageListener 接口来实现Redis键过期回调功能。下面是一个实现Redis键过期回调功能的Spring Boot应用的示例: 步骤一:引入依赖

    2024年02月16日
    浏览(27)
  • 【C语言】回调函数,qsort排序函数的使用和自己实现,超详解

    先记录一下访问量突破2000啦,谢谢大家支持!!! 这里是上期指针进阶链接,方便大家查看:添加链接描述 大家好呀,今天分享一下上期指针进阶中剩余的内容——回调函数,这个很重要滴,让我们一起来学会学懂他吧!!! 标准概念: 回调函数就是一个通过函数指针调

    2024年02月12日
    浏览(37)
  • C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)

    std::chrono 是C++标准库中的一个组件,用于表示和处理时间。其功能就像是心理学中的感知系统,它可以为我们捕捉、量化并操作抽象的时间概念。这就如同我们的大脑可以理解和感知周围环境的时间流逝一样,这种感知和理解能力是人类进行日常活动所必需的。 如同马斯洛的

    2024年02月10日
    浏览(25)
  • C++std::function和std::bind()的概念

    std::function: 一个通用的函数封装器,它允许你存储和调用 任何可以被调用的东西 ,例如函数、函数指针、函数对象、Lambda 表达式等。 std::bind: 用于创建 函数对象 。一个 可调用对象的绑定版本 ,可以 提前绑定 某些参数,稍后调用时只需提供剩余的参数。 在某些情况下

    2024年02月10日
    浏览(29)
  • C++11的std::function和bind绑定器

            在C++中,存在“可调用对象”这么一个概念。准确来说,可调用对象有如下几种定义:                 1、是一个函数指针                 2、是一个具有operator()成员函数的类对象(仿函数)                 3、是一个可转换为函数指针的类对象            

    2024年02月08日
    浏览(30)
  • 【工具小技巧】Cadence Virtuoso Calculator Function Panel计算器函数功能介绍(持续更新……)

    在使用cadence virtuoso仿真过程中我们经常会关注一些电路指标,比如:运放的增益、带宽、相位裕度;bandgap的温漂系数、振荡器的振荡频率等。想要直观的知道这些指标的具体值,需要用到计算器中的函数,如下为计算器的图标和界面。    详细学习每个函数的具体含义和使

    2023年04月15日
    浏览(29)
  • iOS报错命名空间“std”中的“unary_function”

    刚刚将我的 Xcode 升级到 15.0,突然它开始在 RCT_Folly 中出现以下错误 我尝试删除缓存数据和派生数据并清理构建。也尝试删除 pod 和 node_modules。但没有任何帮助。 于是我按照网上提供的方法解决了: 选择 Pods 构建设置 在“Apple Clang - 预处理”部分 在“宏”部分下 添加发布和

    2024年02月05日
    浏览(35)
  • C++11 std::transform函数使用说明

    std::transform是C++标准库中的一个算法,它用于对输入范围内的元素进行操作,并将结果存储在输出范围内。这个算法特别适合于将一种数据类型转换为另一种数据类型。 函数定义在头文件algorithm中 std::transform的基本语法如下: 或者 其中: first1 和 last1 是输入范围的迭代器,

    2024年02月10日
    浏览(25)
  • 【C语言】回调函数(qsort)与模拟实现

    何思何虑,居心当如止水;勿取勿忘,为学当如流水。— 出自《格言联璧·学问类》 解释:无思无虑,心境应当平静如水;不求冒进也不忘记,学业当如流水一般永无止境。 这篇博客我们将会理解回调函数这个概念,以及借用qsort帮助理解,并且最终用qsort的思路来实现冒泡

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包