[英]Map C++ member function to C callback
在C ++项目中,我使用C库访问某些硬件。 C绑定包括回调,用于通知某些输入引脚上的更改。 回调函数如下所示: void callback(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data)
在我的实现中,我有一个SensorController
类,该类具有一个应接收回调的成员函数。 成员函数如下所示: void SensorController::pinChanged(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data)
。
现在我想知道,什么是避免将pinChanged
函数pinChanged
静态函数以便能够将函数分配给回调的最干净的方法?
使用user_data
指针可以为您提供一个指向拥有回调的类的指针。 例如。
void MyCallback(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data)
{
static_cast<Example *>(user_data)->Callback(port, interrupt_mask, value_mask);
}
class Example
{
public:
Example()
{
//setup callback here - i dont know what library you're using but you should be able to pass a this pointer as user_data
init_lib(fictionalparameter1, fictionalparameter2, this);
}
private:
void Callback(char port, uint8_t interrupt_mask, uint8_t value_mask)
{
//callback handler here...
}
friend void MyCallback(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data);
};
接收回调的函数只能是:
为什么不能成为成员类函数?
这都是关于指针的。 指向普通函数或静态函数的指针是存储器的地址。
指向成员类函数的指针是一个偏移量-应该添加到对象指针(this)以访问该方法的数字。
[请参阅jv110评论]
在C ++中,成员函数具有指向对象的隐式参数(成员函数内部的this指针)。 普通C函数可以被认为与成员函数具有不同的调用约定,因此其指针的类型(指针到成员函数与指针到函数)是不同且不兼容的。 C ++引入了一种新型的指针,称为成员指针,只有提供一个对象才能调用它。 https://isocpp.org/wiki/faq/pointers-to-members#addr-of-memfn
您可以在回调中使用user_data来访问类成员方法,如user1320881所示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.