Я хочу вызвать C API из C ++. API ожидает указатель на функцию, хотя для меня функциональность реализована в объекте функции C ++, потому что он имеет состояние.
Фактически желаемая функциональность разделена на два функциональных объекта. C api ожидает функцию, которая имеет два параметра указателя для возврата двух вещей, которые возвращает каждый из объектов функции.
Помимо определения глобальной функции, есть ли способ использовать объект функции из C. Например, может ли он быть переинтерпретирован в указатель функции?
редактирует:
Для простоты можно предположить, что подпись обратного вызова недействительна (*f)(void*, int*, int*)
Ох, и это должно быть C ++ — 03
Большинство API-интерфейсов позволяют передавать какое-то пользовательское состояние через пустой указатель. Вы можете передать указатель на ваш объект через него:
struct my_obj
{
void operator()(int*, int*) {}
static void forwarder(void *state, int *x, int *y) { (*(my_obj*)state)(x, y); }
};
void install_fn(void (*)(void*,int*,int*), void *state);
my_obj obj;
install_fn(my_obj::forwarder, &obj);
Для API, которые не позволяют вам переходить в какое-либо состояние (GLUT является одним из немногих, которые я обнаружил, которые приходят на ум), вам не повезло.
Других решений пока нет …