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

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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值