Следующая библиотека API в стиле C предоставлена библиотекой PiGPIO:
typedef void (*gpioAlertFuncEx_t)(int, int, uint32_t, void *); // assumed
int gpioSetAlertFuncEx(unsigned user_gpio, gpioAlertFuncEx_t f, void *userdata)
В основном она позволяет обрабатывать изменение состояния вывода с помощью функции обратного вызова.
Пока все хорошо,Проблема заключается в переносе этого обратного вызова в класс c ++.
Мой подход заключается в следующем:
class Pin
{
public:
Pin(_GpioPin)
{
gpioSetAlertFuncEx(_GpioPin, &PushButton::internal_gpio_callback, this );
}
void internal_callback_func(int pin, int level, uint32_t tick)
{
cout << "New level: " << pin << " " << level;
}
}
Проблема заключается в том, что тип функции обратного вызова отличается (потому что он нестатический).И выдается ошибка:
error: cannot convert 'void (Pin::*)(int, int, uint32_t, void*) {aka void (Pin::*)(int, int, unsigned int, void*)}' to 'gpioAlertFuncEx_t {aka void (*)(int, int, unsigned int, void*)}' for argument '2' to 'int gpioSetAlertFuncEx(unsigned int, gpioAlertFuncEx_t, void*)'
gpioSetAlertFuncEx(this->GpioPin, &Pin::internal_gpio_callback), this );
В чем прикол?Как привести &PushButton::internal_gpio_callback
в соответствие с требуемым шаблоном?
Позднее редактирование: я не хочу делать метод обратного вызова статическим.