Я использую библиотеку ac, у которой есть API, ожидающий указателя функции C.
Можно ли передать функцию-член класса C++ для этого указателя функции?
Вот C API:
typedef int (*WRITE_FUNC_T)(void *d, char *buffer, int n);
void start(WRITE_FUNC_T callback);
class MyClass {
public:
int mycallback(void *d, char *buffer, int n);
}
Я хочу передать MyClass::mycallback
для start()
. Когда я это делаю, я получил ошибку компиляции, поскольку аргумент типа не совпадает.
Это сработало для меня:
#include <iostream>
#include <sstream>
typedef int (*WRITE_FUNC_T)(void *d, char *buffer, int n);
void start(WRITE_FUNC_T callback) {}
class MyClass {
public:
int mycallback(char *buffer, int n) {
return 0;
}
static int newcallback(void *d, char *buffer, int n) {
return static_cast<MyClass*>(d)->mycallback(buffer, n);
}
};
int main() {
start(&MyClass::newcallback);
}
Я надеюсь, что это помогает вам.
class ClassA
{
public:
int Callback(void *d, char *buffer, int n)
{
return 0;
}
};
typedef int(ClassA::*FncPtr)(void *d, char *buffer, int n);
int main(int argc, const char** args)
{
ClassA* classA = new ClassA();
int retVal = (*classA.*(&ClassA::Callback))(0x00,0x00,0);
return 0;
}
Потому что mycallback
- это метод класса, поэтому его фактическая реализация - это что-то вроде int mycallback(MyClass &this, void *d, char *buffer, int n)
, он несовместим с WRITE_FUNC_T
. Попытайтесь превратить его в static
метод, несмотря на то, что он может не соответствовать вашим потребностям.
попробуйте static int mycallback(void *d, char *buffer, int n);
d
фактически указывает наMyClass
. поэтому в другом месте должен быть какой-то код, который отправляет этот указатель в библиотеку C, чтобы обратный вызов мог его передать. Обычно обратные вызовы следуют за шаблономvoid start(WRITE_FUNC_T callback, void *d);
, Так что абонент может проходитьd
обратно к вам.