我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++11 std::function和std::bind如何使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++11 std::function和std::bind如何使用

这篇文章主要介绍了C++11 std::function和std::bind如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++11 std::function和std::bind如何使用文章都会有所收获,下面我们一起来看看吧。

    概述

    C++11中的std::functionstd::bind是函数对象的重要组成部分,它们可以用于将函数和参数绑定在一起,形成一个可调用的对象。
    std::function可以存储任意可调用对象,包括函数指针、函数对象、lambda表达式等,而std::bind则可以将函数和参数绑定在一起,形成一个新的可调用对象。它们的使用可以大大简化代码,提高代码的可读性和可维护性。

    可调用对象

    C++中有如下几种可调用对象,函数、函数指针、lambda表达式、bind对象、函数对象
    其中,lambda表达式和bind对象是C++11标准中提出的(bind机制并不是新标准中首次提出,而是对旧版本中bind1st和bind2st的合并)。

    std::function

    std::function是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。
    使用std::function可以实现回调函数、事件处理等功能。

    std::function函数原型

    #include <functional>template<class R, class... Args>class function<R(Args...)>;//其中,R 表示返回值类型,Args... 表示参数类型列表。//例如,function<int(float, double)> 表示一个返回值为 int,接受一个 float 和一个 double 类型参数的函数对象。

    std::function的主要作用

    • 对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象,简化调用;

    • 对C++中现有的可调用实体的一种类型安全的包裹(如:函数指针这类可调用实体,是类型不安全的)。

    • 将函数作为参数传递给其他函数;

    • 将函数作为返回值返回;

    • 将函数对象作为参数传递给其他函数;

    • 将函数对象作为返回值返回。

    //例如,定义一个返回值为int,参数为两个int的函数对象: std::function<int(int, int)>func; //可以将一个函数指针或lambda表达式赋值给函数对象: int add(int a, int b) { return a +b; } func = add; // 函数指针赋值 func = [](int a, int b) { return a + b; };// lambda表达式赋值 //调用函数对象可以使用operator(),例如:int result = func(1, 2); // 调用add函数,返回3

    std::function的优缺点

    • 优点:

    可以方便地实现回调函数、事件处理等功能,同时也可以用于实现函数对象的封装和传递。

    • 缺点:

    它的使用会带来一定的性能开销,因为它需要在运行时进行类型检查和动态分配内存。
    此外,如果使用不当,也容易引起内存泄漏和对象生命周期管理的问题。

    std::bind

    std::function是一个可调用对象包装器,是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。

    std::bind函数原型

    template<class F, class... Args> /unspecified/ bind(F&& f, Args&&... args);//其中,F是要绑定的函数对象,Args是要绑定的参数。返回值是一个新的可调用对象,可以直接调用或者存储起来后再调用。

    std::bind的主要作用

    • 将可调用对象和其参数绑定成一个仿函数;

    • 只绑定部分参数,减少可调用对象传入的参数。

    • 绑定函数对象的参数,生成一个新的可调用对象,可以方便地将函数对象作为参数传递给其它函数。

    • 可以将成员函数绑定到对象上,生成一个新的可调用对象,方便地调用成员函数。

    • 可以将成员函数绑定到对象指针上,生成一个新的可调用对象,方便地调用成员函数。

    • 可以将成员函数绑定到对象引用上,生成一个新的可调用对象,方便地调用成员函数。

    • 可以将函数对象绑定到函数指针上,生成一个新的可调用对象,方便地调用函数对象。

    • 可以将函数对象绑定到函数引用上,生成一个新的可调用对象,方便地调用函数对象。

    • 可以将函数对象绑定到std::function对象上,生成一个新的可调用对象,方便地调用函数对象。

    例如,我们有一个函数对象:
    void foo(int a, int b, int c) { std::cout << a << " " << b << " " << c << std::endl; }
    我们可以使用std::bind将它绑定到一些参数上:
    auto f = std::bind(foo, 1, 2, 3);
    这里,f是一个新的可调用对象,它绑定了foo函数和参数1、2、3。我们可以像调用原始函数对象一样调用它:
    f(); // 输出:1 2 3
    我们也可以只绑定部分参数:
    auto g = std::bind(foo, 1, std::placeholders::_1, 3);
    这里,std::placeholders::_1表示占位符,它表示在调用g时,第二个参数会被传递给foo函数。我们可以这样调用g:
    g(2); // 输出:1 2 3
    这就是std::bind的基本用法。它可以方便地将函数对象和参数绑定在一起,生成一个新的可调用对象。

    std::bind的优缺点

    优点:

    可以方便地实现函数对象的复用和参数的延迟绑定,从而提高代码的可读性和可维护性。

    缺点:

    可能会导致代码的复杂性增加,特别是当参数较多时,需要谨慎使用。

    代码示例

    #pragma once#include <iostream>#include <functional>class A {public: bool TESTA(int, char*, int) {  }};class B {public: bool TESTB(std::function<bool(int, char*, int)> func) {  }};int main() { A objA; B objB; auto lambda = [](int a, char* b, int c) {  }; objB.TESTB(lambda); objB.TESTB(std::bind(&A::TESTA, &objA, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); return 0;}

    关于“C++11 std::function和std::bind如何使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++11 std::function和std::bind如何使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    C++11 std::function和std::bind如何使用

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    C++11 std::function和std::bind如何使用

    这篇文章主要介绍了C++11 std::function和std::bind如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++11 std::function和std::bind如何使用文章都会有所收
    2023-07-05

    C++11std::function和std::bind的使用示例详解

    C++11中的std::function和std::bind是函数对象的重要组成部分,它们可以用于将函数和参数绑定在一起,形成一个可调用的对象,这篇文章主要介绍了C++11std::function和std::bind的使用示例详解,需要的朋友可以参考下
    2023-03-19

    C++11中std::function基础用法详解

    std::function是C++11标准库中提供的一种可调用对象的通用类型,它可以存储任意可调用对象,本文就来和大家讲讲它的基础用法,希望对大家有所帮助
    2023-05-18

    C++11中std::ref和std::cref的作用是什么

    这篇文章给大家分享的是有关C++11中std::ref和std::cref的作用是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、源码准备本文是基于gcc-4.9.0的源代码进行分析,std::ref和st
    2023-06-15

    C++11的std::future对象如何使用

    这篇“C++11的std::future对象如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++11的std::fu
    2023-07-05

    如何进行c++11中std::move函数的使用

    这篇文章给大家介绍如何进行c++11中std::move函数的使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++11在运行期有所增强,通过增加核心的右值引用机制来改善临时对象导致的效率低下的问题。C++临时对象引
    2023-06-29

    C++的std::visit如何使用

    这篇文章主要介绍“C++的std::visit如何使用”,在日常操作中,相信很多人在C++的std::visit如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++的std::visit如何使用”的疑
    2023-06-29

    C++中std::conditional如何使用

    本篇内容介绍了“C++中std::conditional如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!std::conditiona
    2023-07-02

    C++如何使用std::vector容器

    这篇文章给大家分享的是有关C++如何使用std::vector容器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言vector实质是C++的一个类,与数组很相似,但是vector的优势是可以动态扩展,不需要考虑
    2023-06-20

    C++ 函数模板与 std::function 的比较和应用?

    函数模板和 std::func++tion 都是 c++ 中表示函数的方法,它们各有优劣:函数模板:静态类型安全、性能优异,但灵活性较低,不能存储动态函数对象。std::function:动态类型安全、灵活度高,可以存储 lambda 表达
    C++ 函数模板与 std::function 的比较和应用?
    2024-04-24

    C++11之std::future对象的使用以及说明

    这篇文章主要介绍了C++11之std::future对象的使用以及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-28

    如何使用C++ 11中的auto和decltype

    这篇文章将为大家详细讲解有关如何使用C++ 11中的auto和decltype,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C++ 11中引入的auto主要有两种用途:自动类型推断和返回值占
    2023-06-17

    C++11中如何使用forward函数

    本篇文章给大家分享的是有关C++11中如何使用forward函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。传值函数模板假设有一组函数,根据两个输入值进行工作,例如下面的ad
    2023-06-19

    C++11中lambda表达式如何使用

    本篇文章为大家展示了C++11中lambda表达式如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。首先这个lambda就是罗马字母λ,lambda表达式即λ表达式。数学上有一个概念叫λ演算,其
    2023-06-19

    C++11中新特性“=default”,“=delete”如何使用

    小编给大家分享一下C++11中新特性“=default”,“=delete”如何使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、 =default 和=de
    2023-06-15

    C++11中委托构造函数如何使用

    这篇文章将为大家详细讲解有关C++11中委托构造函数如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C++11之前的状况构造函数多了以后,几乎必然地会出现代码重复的情况,为了避免这种情
    2023-06-19

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录