zoukankan      html  css  js  c++  java
  • C++——类的成员函数指针以及mem_fun适配器

    有这样一个类,我们以此类为基础:

     1 class Foo
     2 {
     3 public:
     4 
     5     //void (Foo::*)(int)
     6     void foo(int a)
     7     {
     8         cout << a << endl;
     9     }
    10 
    11     //void (*)(int)
    12     static void bar(int a)
    13     {
    14         cout << a << endl;
    15     }
    16 };

    我们尝试调用函数指针:

    void (*pFunc)(int) = &Foo::foo;

    得到编译错误:

    error: cannot convert ‘void (Foo::*)(int)’ to ‘void (*)(int)’ in initialization

    原因很简单,类成员函数,包含一个隐式参数this,所以函数void foo(int a)包含两个参数。
    我们应使用void(Foo::*)(int)类型来生成函数指针,使用方法如下:

    void (Foo::*pFunc2)(int) = &Foo::foo;
    
    Foo f;
    (f.*pFunc2)(12);
    
    Foo *p = &f;
    (p->*pFunc2)(12);

    相对于static成员函数,我们可以像调用普通函数指针一样使用它,原因是static成员函数中没用隐式参数this。

    我们可以通过这样调用该函数指针:

    void (*pFunc3)(int) = &Foo::bar;
    
    pFunc3(12);

    在函数foo()中,包含了一个隐式参数this,那么我们如何将它转化出来呢?

    我们可以通过使用STL中的mem_fun,这是一种函数适配器。

    调用方法如下:

    Foo f;
    
    (mem_fun(&Foo::foo))(&f, 12);

    mem_fun的转化方式是这样的:

    void(Foo::*)(int)  ->   void(*)(Foo *, int);
  • 相关阅读:
    MySQL数据库开发的36条原则
    su和sudo的区别与使用
    利用modelarts和物体检测方式识别验证码
    华为云大咖说-庄表伟:架构师的基本功——管理篇
    【玩转MLS系列】基础教程
    Java程序性能优化
    洛谷P4551 最长异或路径
    POJ 2001 Shortest Prefixes
    线段树区间修改
    接毒瘤
  • 原文地址:https://www.cnblogs.com/gjn135120/p/4015602.html
Copyright © 2011-2022 走看看