• C++11特性-可调用对象


    1.闭包

    含义:带有上下文的函数(有状态的函数)。函数时代码,状态就是一组变量,将代码与一组变量捆绑,就形成了闭包(比较像一个类)。

            程序的闭包捆绑,必须发生在运行时

    2.可调用对象

           函数指针、具有operator成员函数的类对象(仿函数)、可被转换成函数指针的类对象、类成员函数指针或者类成员指针都可以被称为可调用对象

    1. //函数指针
    2. void func(int num,string name,int num2) {
    3. cout << "num = " << num << ",name = " << name << endl;
    4. }
    5. using funcptr = void(*)(int,string,int);
    6. class CC
    7. {
    8. public:
    9. //具有operator成员函数的类对象(仿函数)重载()
    10. void operator()(string str) {
    11. cout << "仿函数 str = " << str << endl;
    12. }
    13. //可被转换成函数指针的类对象
    14. operator funcptr() {
    15. //return hh; //error
    16. return ww;
    17. }
    18. //属于对象
    19. void hh(int val, string str,int num2) {
    20. cout << "val = " << val << " str = " << str << endl;
    21. }
    22. //属于类
    23. static void ww(int val, string str,int num2) {
    24. cout << "val = " << val << " str = " << str << endl;
    25. }
    26. int id =10;
    27. }
    28. //调用
    29. //函数指针
    30. cout << "函数指针 : ";
    31. funcptr2(22, "lili",22);
    32. //仿函数
    33. CC c;
    34. c("hgello world");
    35. //类对象转换的函数指针
    36. CC cc;
    37. cout << "类对象转换的函数指针 : ";
    38. cc(67,"xiaoli",67);
    39. CC cccc;
    40. //类的成员函数指针
    41. funcptr func = CC::ww;
    42. using fptr = void(CC::*)(int,string,int);
    43. fptr fp = &CC::hh;
    44. cout << "类成员函数指针 fp : ";
    45. (cccc.*fp)(333, "ddd",333);
    46. //类的成员指针(变量)
    47. using ptr1 = int CC::*;
    48. ptr1 pt = &CC::id;
    49. cccc.*pt = 1000;
    50. cout << "类成员指针: id = " << cccc.id << endl;

    3. 可调用对象包装器(std::function)模板类

            std::function<返回值类型(参数列表)> diy_name = 可调用对象

    1. /********与可待用对象连一起看**********/
    2. //包装普通函数
    3. function<void(int, string,int)> f1 = funcTT;
    4. cout << "包装普通函数 : ";
    5. f1(111, "aaaaaaaaaa",111);
    6. //包装类的静态函数
    7. function<void(int, string,int)> f2 = CC::ww;
    8. cout << "包装类的静态函数 : ";
    9. f2(222,"bbbbbbbbbb",222);
    10. //包装仿函数
    11. CC c;
    12. function<void( string)> f3 = c;
    13. cout << "包装仿函数 : ";
    14. f3("ccccccccccc");
    15. //包装可被转换成函数指针的类对象
    16. CC cc;
    17. function<void(int, string,int)> f4 = cc;
    18. cout << "包装可被转换成函数指针的类对象 : ";
    19. f4(444, "dddddddddd",444);

    4.可调用对象绑定器(std::bind)

            std::bind用来将对象与参数绑定,绑定后的结果可以使用std::function进行保存,并延迟调用到我们任何需要的时候。

            其作用:       

                    1.将可调用对象与其参数一起绑定成一个仿函数

                    2.将多元(参数个数为n,n>1)可调用对象转换成一元或者(n-1)元可调用对象,即只

            绑定部分参数

    1. //绑定非类成员函数\变量
    2. auto f = bind(可调用地址\函数名, 绑定的参数或者占位符);
    3. // 绑定类成员函数
    4. auto f = bind(类函数,类实例对象地址, 绑定的参数或者占位符);
    5. // 绑定类成员变量
    6. auto f = bind(类成员变量, 类实例对象地址);

             绑定非类成员函数

    1. void outputAdd(int x, int y) {
    2. cout << "x = " << x << " , y = " << y << " ,x+ y = " <<x+ y << endl;
    3. }
    4. void outputTest(int a,int b,const function<void(int,int)> &f) {
    5. if (a % 2 == 0) {
    6. f(a,b);
    7. }
    8. }
    9. for (int i = 0; i < 10;++i) {
    10. auto f = bind(outputAdd, i + 100, i + 200);
    11. outputTest(i,i,f);
    12. auto f1 = bind(outputAdd, placeholders::_1, placeholders::_2);
    13. outputTest(i, i, f1);
    14. }

            绑定类成员函数与变量

    1. class DD
    2. {
    3. public:
    4. void out(int x, int y) {
    5. cout << "x = " << x << " , y = " << y << endl;
    6. }
    7. int m_num = 99;
    8. };
    9. DD d;
    10. bind(&DD::out, &d, 520, 1314);
    11. bind(&DD::out,&d,520, placeholders::_1)(1314);
    12. auto ff = bind(&DD::out, &d, 520, placeholders::_1);//ff为仿函数
    13. ff(666);//二元降为了一元
    14. function<void(int)> fff= ff;//将ff包装成一个可调用对象fff
    15. function<void(int ,int)> ffff = ff;//将ff包装成一个可调用对象ffff
    16. cout << "将类成员函数包装成一个可调用对象:" << endl;
    17. fff(123);
    18. ffff(123,456);//只传入了123
    19. cout << "绑定类成员变量:" << endl;
    20. //绑定类成员函数
    21. auto rr = bind(&DD::m_num, &d);//rr为仿函数
    22. cout << "rr = " << rr()<<endl;
    23. rr() = 123;
    24. cout << "rr = " << rr() << endl;
    25. cout << "将类成员变量包装成一个可调用对象:" << endl;
    26. function<int& (void)> rrr = rr;//将rr包装成一个可调用对象
    27. cout << "rrr = " << rrr() << endl;
    28. rrr() = 22;
    29. cout << "rrr = " << rrr() << endl;

     

  • 相关阅读:
    4、nerf(pytorch)
    【论文下饭】A Systematic Survey on Deep Generative Models for Graph Generation
    m基于rbf神经网络和遗传算法优化的MIMO-OFDM系统信道估计算法matlab仿真
    LCR 101. 分割等和子集——力扣——背包问题、动态规矩
    【Unity3D】UI Toolkit数据动态绑定
    java常见面试题(未整理,后续可能一直更新)
    Splunk UBA 之 Kubernetes 证书过期
    GAN原理及代码实现
    3天精通Postman---基础应用&接口测试流程&接口架构和协议
    【KMP算法】大白话式详细图文解析(附代码)
  • 原文地址:https://blog.csdn.net/weixin_44840658/article/details/128195362