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;
}