c++中的类成员函数指针

本文介绍了如何在C++中使用类成员函数指针,包括其定义和调用方式,以及在QMap中作为键值对的使用。同时探讨了std::function的使用,作为通用的多态函数封装器,可以存储和调用任何可调用对象,包括成员函数。通过std::bind结合std::function,可以更灵活地管理和调用成员函数。
摘要由CSDN通过智能技术生成

c++中的类成员函数指针

发生的事情

最近,想用一个QMap来创建字符串和一个函数的键值对,要用某个函数的时候,只需要根据键来获取值然后再调用就好了。也就不许要那么多的if或者switch了。
但是当我定义这个QMap时,我犯了难,我一下子不知道怎么定义,因为我是要把成员函数给放到这个QMap里面.

正常的函数指针定义

void func()
{
    qDebug() << "123";
}

typedef void (*funType) ();

funType fun = func;
fun();

像上面这样,就定义了一个返回值为void,且没有参数的函数指针,并且通过指针调用了函数.但是类的成员函数又是另外一种使用方法,

定义类的成员函数指针

定义的方法:

Class A
{
public:
    A();

private:
    void func();

    void func2();

private:
    typedef void (A::*funType) ();  //这里定义了类A的成员函数中返回值为void,没有参数的函数指针
    QMap<QString, funType> m_funMap;
}

这上面就定义了一个QMap,根据前面的QString就可以调用对应的函数.

然后我又在调用方法上犯了难,在网上搜索之后,得到如下调用方式:

    
    /*我先是插入了对应的键值对*/
    /*
        m_funMap.insert("func", A::func);
        m_funMap.insert("func2", A::func2);
    */

    (this->*m_funMap.value("func"))();

因为c++的成员函数的地址都是一样的,也就是说,一个类的成员函数就只有一个地址,而不是跟随实例.那么怎么区分这些实例调用的函数呢,这就需要用到this指针了,
所以,需要加上一个this来调用.

std::function

我在网上搜索的时候,发现了std::function这个东东,本着学习的心态我看了一下.
关于这个,API Reference Document std::function的解释是:
类模板 std::function 是通用多态函数封装器。 std::function 的实例能存储、复制及调用任何可调用 (Callable) 目标——函数、 lambda 表达式、 bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。

存储的可调用对象被称为 std::function 的目标。若 std::function 不含目标,则称它为空。调用空 std::function 的目标导致抛出 std::bad_function_call 异常。
用这种方法的存储函数指针的方式是:

Class A
{
public:
    A();

private:
    void func();

    void func2(int a);

private:
    typedef void (A::*funType) ();  //这里定义了类A的成员函数中返回值为void,没有参数的函数指针
    QMap<QString, funType> m_funMap;
}


std::function<void (A::*)()> function = std::bind(A::func, this);
funtion();

// 带参数的指针如下

std::function<void (A::*) (int)> function1 = std::bind(A::func, this, std::placeholders::_1);
function1();

关于bind的介绍可以看这里API Reference Document std::bind

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值