Проблема заключается в следующем.
Есть функция, вот её прототип.
voidattachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode);
есть так же класс
classFoo
{
..
voidololo();
..
}
в его конструкторе я пытаюсь вызвать функцию attachInterrupt следующим образом
attachInterrupt(0, this->ololo, FALLING);
на что получаю ответ
error: cannot convert ‘Foo::ololo’ from type ‘void* (Foo::)()’ to type ‘void (*)()’
Понимаю, что вся проблема скорее всего в том, что надо правильно преобразовать типы, но не могу допереть как именно. Если вызывать attachInterrupt не из класса и не для члена класса, то всё работает. Подскажите пожалуйста, как правильно вызвать?
Пните пожалуйста в нужном направлении, где я смогу раз и навсегда разобраться в этой теме.
Любой не-статический метод класса неявно получает первым аргументом this. Вы должны это как то обеспечить (скажем указать в типе указателя на ф-ю что она получает this, но этот this надо еще как то передать туда при вызове).
Можно написать обертку, которая будет вызывать соотв. функцию подсовывая this из какой нить глобально переменной, но это жуткий костыль.
Передавать this, очевидно же. Если надо передать коллбек с состоянием в сишный код, то забрасывают указатель на функцию типа void (*)(void*) где та void* — это юзерский контекст, который внутри коллбека кастуется к чему надо. Можно передать this так. Если там можно передавать плюсовые объекты, а указатель на функцию стоит просто из-за незнания чего бы-то ещё, то тут уже насоветовали всяких std::function.