[C++]终极详解:类的成员函数与STD::FUNCTION之间的转换使用

本文详细介绍了如何在C++11及更高版本中,将类的成员函数指针转换为std::function,以及这样做的原因。通过示例代码展示了如何在不直接继承的情况下,实现不同类中相同函数签名的成员函数调用,同时保持代码的灵活性和类型安全性。讨论了保持旧代码兼容性、构建标准代码以及编写通用框架的重要性。
摘要由CSDN通过智能技术生成
class test{

public :
    void * func(void *){
        std::cerr << " void * func(void *) output" << std::endl;
        return nullptr;
    }
};

typedef void* (test::* MFP)(void*);

//example code:
test *tt = new test();
MFP p = &test::func;
//进行第一次转换
void * pfunc=(unsigned*)&p;
//根据传值获取成员函数地址
MFP * addr =(MFP*)pfunc;
//绑定函数与类
auto scall = std::bind(*addr,*tt,std::placeholders::_1);

//执行操作
void* px = NULL;
scall(px);

在C++11甚至C++20都开始盛行的年代std::function(通用多态函数封装器)大行其道,为什么还要将类的指针函数变型为std::function?

1.为了保持旧代码与新标准的兼容性

2.构建更加灵活而又标准的C++代码

3.便于写一些通用框架或者插件库

下面是测试类test,拥有方法func

class test{
public :
    void * func(void *){
        std::cerr << " void * func(void *) output" << std::endl;
        return nullptr;
    }
}
 

通常,我们会对所有继承test类执行如下定义,也就是说

//执行定义
typedef void* (test::* MFP)(void*)

//将func方法作为参数传递给MFP
//example code:
test *t_ptr = new test();
MFP p = &test::func;

然后就可以采用p(void*)的形式去调用test类的func方法了。美中不足的是,如果所有需要去按照test的模式都需要去继承test类,这尽管保证了继承类的类型安全,却也对C++的使用形成了限制,特别是在与新标准std::function兼容上产生一定“误区”

对于不同的类,包含同样的void * _f(void *)形式的函数如果既不是同一个类,也不想使用重复的包裹代码去包裹函数,可以采取以下的方式将函数地址作为参数传递给bind

//进行第一次转换 
void * pfunc=(unsigned*)&p;
//根据传值获取成员函数地址
MFP * addr =(MFP*)pfunc;
//绑定函数与类
auto scall = std::bind(*addr,*t_ptr,std::placeholders::_1);

//执行操作
void* px = NULL;//此处为参数
scall(px);//此处为绑定的test类的func方法

参照上述代码即可实现成员类函数与成员类完全由指针代替,既保留了指针的灵活性,同时又确保了调用函数的类型安全。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值