2012-12-10 2 views
0

C++에서 C API를 호출하려고합니다. API는 함수 포인터를 기대하지만, 나에게 기능은 상태를 가지고 있기 때문에 C++ 함수 객체로 구현됩니다.API가 함수 포인터를 요청할 때 함수 객체 사용

실제로 원하는 기능성은 두 개의 기능 개체로 나누어집니다. C API는 각 함수 객체가 반환하는 두 가지를 반환하기위한 두 개의 포인터 매개 변수가있는 함수를 기대합니다.

전역 함수를 정의하는 것 외에도 C의 함수 객체를 사용하는 방법이 있습니다. 예를 들어 reinterpret_casted를 함수 포인터로 사용할 수 있습니까?

편집 :

다시 호출의 서명이 무효 (*f)(void*, int*, int*)

오라고 가정 할 수는 확인 편의상

하고 있어야한다 C++ - 03 대부분의 API를 일부를 전달할 수 있도록

+0

아마도 λ 함수를 전달합니까? – Cornstalks

+2

C API에 함수 포인터가 요구하는 함수 서명은 무엇입니까? – phonetagger

+0

@phonetagger 간단하게 (ok * (int *, int *)를 가정하기 위해 ok) void *는 일부 상태 정보를 전달합니다. – san

답변

3

void 포인터를 통해 사용자 상태의 일종. 당신은 그곳을 통해 개체에 대한 포인터를 전달할 수 있습니다 : 당신이 어떤 상태를 통과하는 것을 허용하지 않습니다 API를, 당신 '(GLUT는 유일하게 마음에 와서 내가 찾은 사람 중 하나입니다)에 대한

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); 

행운을 빌어 요.

+1

API가 상태 정보 전달을 직접 지원하지 않으면 여전히 수행 할 수 있습니다. 한 가지 방법은 단순히 오래된 글로벌 변수입니다. 스레딩이 관련된 경우 로컬 저장소를 트레드해야합니다. 또 다른 방법은 정보를 사용 가능한 일부 데이터와 연결하는 것입니다. 윈도우 윈도우 프로퍼티. 세 번째는 비행 중에 생성 된 기계 코드 레벨 트램펄린 기능을 사용하는 것입니다. 이것은 Borland GUI 프레임 워크에서 사용되었으며, 가장 효율적이고 안전한 작업이지만 오늘날의 "보안"조치와 약간 호환되지 않을 수 있습니다. –

+0

OP가 구체적인 경우에 대해 너무 모호하다는 점을 제외하고는 해당 줄을 따라 답변을 게시합니다. :-( –

+0

휴대용 운에서 완전히 벗어나지 못했습니다 ... 고정 된 크기의 정적 트램펄린 기능을 가진 정면을 사용하는 이러한 API를 통해 누군가가 인터페이스 한 곳을 보았습니다.이 트램폴린에 대한 포인터의 정적 인 무료 목록 (컴파일러/오브젝트 파일 의미에서 trampolines가 아닙니다.) API를 통해 함수를 등록 할 때 다음 무료 트램폴린을 등록하고 자유 목록에서 제거합니다. 콜백하면 다시 자유롭게 추가됩니다 목록 등등. trampolines가 다 떨어질 때까지, 그것은 폭발 할 것이다. 그러나 결코하지 않았다. – phonetagger

관련 문제