文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-05 13:17

关注

这篇文章主要介绍了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的主要作用

//例如,定义一个返回值为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的主要作用

例如,我们有一个函数对象:
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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯