iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++11如何实现闭包
  • 453
分享到

c++11如何实现闭包

2023-06-15 09:06:10 453人浏览 独家记忆
摘要

这篇文章主要介绍了c++11如何实现闭包,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是闭包一个函数,带上了一个状态,就变成了闭包了。那什么叫 “带上状态” 呢? 意思是

这篇文章主要介绍了c++11如何实现闭包,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

什么是闭包

一个函数,带上了一个状态,就变成了闭包了。那什么叫 “带上状态” 呢? 意思是这个闭包有属于自己的变量,这些个变量的值是创建闭包的时候设置的,并在调用闭包的时候,可以访问这些变量。

函数是代码,状态是一组变量,将代码和一组变量捆绑 (bind) ,就形成了闭包。

闭包的状态捆绑,必须发生在运行时。

仿函数:重载 operator()

#define _CRT_SECURE_NO_WARNINGS#include <iOStream>#include <string>#include <memory>#include <vector>#include <map>class MyFunctor{public:    MyFunctor(int temp): round(temp) {}    int operator()(int temp) {return temp + round; }private:    int round;};void mytest(){    int round = 2;    MyFunctor f(round);    std::cout << "result: " << f(1) << std::endl; // operator()(int temp)    return;}int main(){    mytest();    system("pause");    return 0;}

std::bind绑定器

在C++中,可调用实体主要包括:函数、函数指针、函数引用、可以隐式转换为函数指定的对象,或者实现了opetator()的对象。

C++11中,新增加了一个std::function类模板,它是对C++中现有的可调用实体的一种类型安全的包裹。通过指定它的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行它们。

std::function对象最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等,但是可以与NULL或者nullptr进行比较。

#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <memory>#include <functional>#include <vector>#include <map>void func(void){// 普通全局函数    std::cout << __FUNCTION__ << std::endl;}class Foo{public:    static int foo_func(int a)    {// 类中的静态函数        std::cout << __FUNCTION__ << "(" << a << ")->: ";        return a;    }};class Bar{public:    int operator ()(int a)    {// 仿函数        std::cout << __FUNCTION__ << "(" << a << ")->: ";        return a;    }};void mytest(){    // std::function对象最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等,但是可以与NULL或者nullptr进行比较。    // 绑定一个普通函数    std::function< void(void) > f1 = func;    f1();    // 绑定类中的静态函数    std::function<int(int)> f2 = Foo::foo_func;    std::cout << f2(11) << std::endl;    // 绑定一个仿函数    Bar obj;    std::function<int(int)> f3 = obj;    std::cout << f3(222) << std::endl;        return;}int main(){    mytest();    system("pause");    return 0;}

std::bind

std::bind是这样一种机制,它可以预先把指定可调用实体的某些参数绑定到已有的变量,产生一个新的可调用实体,这种机制在回调函数的使用过程中也颇为有用。

C++98中,有两个函数bind1st和bind2nd,它们分别可以用来绑定functor的第一个和第二个参数,它们都是只可以绑定一个参数,各种限制,使得bind1st和bind2nd的可用性大大降低。

在C++11中,提供了std::bind,它绑定的参数的个数不受限制,绑定的具体哪些参数也不受限制,由用户指定,这个bind才是真正意义上的绑定。

#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <memory>#include <functional>#include <vector>#include <map>void func(int x, int y){    std::cout << x << " " << y << std::endl;}void mytest(){    std::bind(func, 1, 2)();    std::bind(func, std::placeholders::_1, 2)(1);    func(1, 2);    // std::placeholders 表示的是占位符    // std::placeholders::_1是一个占位符,代表这个位置将在函数调用时,被传入的第一个参数所替代。    std::bind(func, 2, std::placeholders::_1)(1);    std::bind(func, 2, std::placeholders::_2)(1, 2);    std::bind(func, std::placeholders::_1, std::placeholders::_2)(1, 2);    std::bind(func, std::placeholders::_3, std::placeholders::_2)(1, 2, 3);        //std::bind(func, 2, std::placeholders::_2)(1); // err, 调用时没有第二个参数    return;}int main(){    mytest();    system("pause");    return 0;}

std::bind和std::function配合使用

通过std::bind和std::function配合使用,所有的可调用对象均有了统一的操作方法

#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include <memory>#include <functional>#include <vector>#include <map>class Test{public:    int i; // 非静态成员变量    void func(int x, int y)    { // 非静态成员函数        std::cout << x << " " << y << std::endl;    }};void mytest(){    Test obj; // 创建对象    // 绑定非静态成员函数    std::function<void(int, int)> f1 = std::bind(&Test::func, &obj, std::placeholders::_1, std::placeholders::_2);    f1(1, 2); // 输出: 1 2    obj.i = 10;    // 绑定非静态成员变量    std::function<int &()> f2 = std::bind(&Test::i, &obj);    f2() = 123;  // obj.i = 123;    std::cout << "obj.i: " << obj.i << std::endl;    return;}int main(){    mytest();    system("pause");    return 0;}

感谢你能够认真阅读完这篇文章,希望小编分享的“c++11如何实现闭包”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网其他教程频道,更多相关知识等着你来学习!

--结束END--

本文标题: c++11如何实现闭包

本文链接: https://www.lsjlt.com/news/279648.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • c++11如何实现闭包
    这篇文章主要介绍了c++11如何实现闭包,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是闭包一个函数,带上了一个状态,就变成了闭包了。那什么叫 “带上状态” 呢? 意思是...
    99+
    2023-06-15
  • 浅谈c++11闭包的实现
    目录什么是闭包仿函数:重载 operator()std::bind绑定器std::bindstd::bind和std::function配合使用什么是闭包 一个函数,带上了一个状态,...
    99+
    2024-04-02
  • Javascript中如何实现闭包
    这篇文章主要介绍了Javascript中如何实现闭包,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。闭包(closure)是Javascrip...
    99+
    2024-04-02
  • C++11如何实现无锁队列
    无锁操作的本质依赖的原子操作,C++11提供了atomic的原子操作支持 atomic compare_exchange_weak / compare_exchange_stron...
    99+
    2024-04-02
  • Golang闭包函数如何实现?
    在 go 中,闭包函数是指可以访问外部变量的匿名函数。实现方法:创建闭包函数时,会形成对外部变量的引用。实战应用包括累积数字列表的和。优点:提高代码可维护性和可重用性,封装状态,以及创建...
    99+
    2024-04-11
    golang 闭包函数 作用域
  • C++项目中怎么实现闭包
    今天就跟大家聊聊有关C++项目中怎么实现闭包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。示例#include <iostream>#include ...
    99+
    2023-06-19
  • Swift中如何实现转义闭包
    这篇文章主要为大家展示了“Swift中如何实现转义闭包”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Swift中如何实现转义闭包”这篇文章吧。转义与非转义闭包在谈论转义闭包时,我们总是指作为函数...
    99+
    2023-06-25
  • Python中的闭包是如何实现的?
    Python中的闭包是如何实现的?闭包是一种函数内部定义的函数,并且在函数内部引用了外部函数的变量。这种特性使得内部函数可以访问外部函数的变量,并且在外部函数执行完毕后,闭包仍然可以访问和操作外部函数的变量。闭包在Python中通过以下几个...
    99+
    2023-10-22
    Python 闭包 实现
  • JavaScript如何使用闭包实现私有变量
    这篇文章主要介绍JavaScript如何使用闭包实现私有变量,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用闭包实现私有变量function Person(name,&n...
    99+
    2024-04-02
  • C#如何实现抢红包算法
    今天小编给大家分享一下C#如何实现抢红包算法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。二倍均值法(公平版) 发...
    99+
    2023-06-29
  • Python闭包怎么实现
    本篇内容介绍了“Python闭包怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、闭包的概念请大家跟我理解一下,如果在一个函数的内部...
    99+
    2023-06-29
  • 如何实现C#启动Windows服务及关闭
    如何实现C#启动Windows服务及关闭,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#启动Windows服务及关闭实例实现的步骤和使用调用的类是什么呢?让我们来看看具体的实...
    99+
    2023-06-17
  • C#如何实现多文件打包压缩
    C#如何实现多文件打包压缩,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。最近项目需要实现多文件打包的功能,尝试了一些方法,最后发现使用ICSharpCode.S...
    99+
    2023-06-22
  • C++11引用合并怎么实现
    本篇内容介绍了“C++11引用合并怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实参推断考虑下面的模板函数和调用代码。对于前两种情况...
    99+
    2023-06-19
  • C++11中跳转initializer_list怎么实现
    本篇内容介绍了“C++11中跳转initializer_list怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.初始化列表的实现(...
    99+
    2023-06-29
  • C++11中跳转initializer_list实现分析
    目录1.初始化列表的实现2. initializer_list<T>模板3.让自定义的类可以接受任意长度初始化列表1.初始化列表的实现 (1)当编译器看到{t1,t2&h...
    99+
    2024-04-02
  • c#闭包出现的问题怎么解决
    在C#中,闭包可能会引发内存泄漏或者变量捕获不正确的问题,可以通过以下方法来解决: 手动解除闭包引用:在闭包中,确保不再需要引用...
    99+
    2024-04-02
  • Golang中的闭包怎么实现
    这篇文章主要介绍了Golang中的闭包怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang中的闭包怎么实现文章都会有所收获,下面我们一起来看看吧。1、什么是闭包?在真正讲述闭包之前,我们先铺垫一点...
    99+
    2023-07-04
  • C++11 nullptr实现初始化空指针
    实际开发中,避免产生“野指针”最有效的方法,就是在定义指针的同时完成初始化操作,即便该指针的指向尚未明确,也要将其初始化为空指针。 所谓“野指针&...
    99+
    2024-04-02
  • C++11怎么实现字符串分割
    本文小编为大家详细介绍“C++11怎么实现字符串分割”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++11怎么实现字符串分割”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。C++11 字符串分割代码示例如下#i...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作