Вы не можете напрямую передать указатель на объект-объект C ++ как указатель на код C (или даже на код C ++).
Кроме того, чтобы переносить обратный вызов на код C, он должен быть по крайней мере, объявлен как функция extern "C"
non-member. По крайней мере, поскольку некоторые API требуют специальных соглашений о вызовах функций и, таким образом, дополнительных модификаторов деклараций.
Во многих средах C и C ++ имеют одинаковые соглашения о вызовах и отличаются только именем, так что любая глобальная функция или статический член Работа. Но вам все равно нужно обернуть вызов operator()
в нормальной функции.
class MyFunctor {
// no state
public:
MyFunctor();
int operator()(SomeType ¶m) const;
}
вы можете написать нормальную внешнюю функцию «C», которая создает функтор и выполняет свой оператор (). extern "C" int MyFunctorInC(SomeType *param)
{
static MyFunctor my_functor;
return my_functor(*param);
}
class MyFunctor {
// Some fields here;
public:
MyFunctor(/* some parameters to set state */);
int operator()(SomeType ¶m) const;
// + some methods to retrieve result.
}
, а функция обратного вызова C принимает какой-то параметр состояния пользователя (обычно void *): void MyAlgorithmInC(SomeType *arr,
int (*fun)(SomeType *, void *),
void *user_state);
вы можете написать обычный экстент «C ", которая передает свой параметр состояния объекту-функтору: extern "C" int MyFunctorInC(SomeType *param, void *user_state)
{
MyFunctor *my_functor = (MyFunctor *)user_state;
return (*my_functor)(*param);
}
и использует его следующим образом: MyFunctor my_functor(/* setup parameters */);
MyAlgorithmInC(input_data, MyFunctorInC, &my_functor);