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);
  • 相关阅读:
    20.Docker Swarm集群
    Phalcon下命令行应用(command line applications)
    Mysql 命令备忘
    PHPExcel+phalcon+yii批量导入
    Yii 之分页 + bootstrap
    PHPMailer+phalcon中使用
    Phalcon之分页
    虚拟机中ip和host设置问题
    php RSS订阅功能
    ubuntu/linux下设置永久路由
  • 原文地址:https://www.cnblogs.com/gjn135120/p/4015602.html
Copyright © 2011-2022 走看看