c语言如何回调c++非静态成员函数

c语言如何回调c++非静态成员函数?

需要解决类成员函数指针强转为普通的函数指针编译器报错的问题。

如何将c++成员函数作为回调函数,传递给c语言调用?

最开始直接将类成员函数指针强转为普通的函数指针,发现在某些平台(比如安卓)编译器会报错,如下所示错误:

最终发现如下方式可以骗过编译器,不再报错。

在ubuntu、安卓、MTK LINUX测试未发现问题。


 

template <typename MessageT>

std::shared_ptr<StickyPublisher<MessageT>> NewStickyPublisherImpl(
                            const std::string &topic_name, const std::string &topic_type) {

    std::shared_ptr<StickyPublisher<MessageT>> puber =                             
                                           std::make_shared<StickyPublisher<MessageT>>();
    
    //cheat compiler
    union    
    {

        void(* c_cbk)(void* param,dds_addr_u *const , uint32_t );//第一个参数用于传对象指针


        void(StickyPublisher<MessageT>::*cpp_cbk)(dds_addr_u *const , uint32_t);

    }cbk;

    cbk.cpp_cbk = &StickyPublisher<MessageT>::PubMsgPeer;

    int32_t ret = DoRegPub(&(puber->puber_),topic_name.c_str(), topic_type.c_str(),        
                                (new_sub_cbk_t)cbk.c_cbk,puber.get() );

    if (kDdsRetOK != ret) {

        byd_cf_assert(kDdsRetOK == ret);

        return nullptr;

    }

    puber->mTop = topic_name;

    puber->mTop_typ = topic_type;

    puber->nid = GetNid();

    return puber;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无v邪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值