2013-03-27 1 views
0

저는 부스트 라이브러리가 매우 새롭습니다.부스트 멤버 함수 포인터

glutDisplayFunc() 등에 을 전달한 콜백을 단일 클래스에 바인딩하여 그래픽 프로그램을 구현하려고했습니다.

저는 상수 전역 클래스 객체가 없어도이를 수행하기를 원했습니다.

코드에 설명하기 :

class CallbackHolder { 
public: 
    void dostuff(void) { 
     // etc. 
    } 
}; 
void bind() { 
    glutIdleFunc((new CallbackHolder())->dostuff); 
} 

나는이 부스트 :: 바인드의 사용을 통해 가능하다 알고 부스트 : : 기능.

그러나 한 가지 문제는 boost :: function을 일반 함수 포인터로 다시 변환하는 것이 었습니다.

어떻게 작성 하시겠습니까?

+0

'boost :: function'을 일반 함수 포인터로 변환 할 수 없습니다. 일반 일반 함수를 콜백으로 사용해야하며 주위를 감당할 방법이 없습니다. –

답변

0

boost::function에서 일반 함수 포인터로 변환 할 수 없으며 멤버 함수 포인터에서 일반 함수 포인터로 변환 할 수 없습니다. 사용자 데이터를 제공 할 수있는 콜백을 허용하는 함수에 대한 해결 방법이 있습니다.

불행히도 glut 인터페이스는 사용자 데이터를 제공 할 수 없습니다. 즉, 전역 변수와 일반 함수를 사용하여 가장 끔찍한 솔루션을 계속 사용할 수 있습니다.

class CallbackHolder { 
    public: 
    void dostuff(void) { 
     // etc. 
    } 
}; 

CallbackHolder * g_callbackHolder = NULL; 

void call_callback_holder(void) { 
    if(g_callbackHolder) g_callbackHolder->dostuff(); 
} 

void bind() { 
    g_callbackHolder = new CallbackHolder(); 
    glutIdleFunc(&call_callback_holder); 
} 
+0

Darn. 소스 코드가 그렇게 추악해질 수 있기 때문에 나는 이것을하지 않아도되기를 정말로 바랬다. 어쨌든 고마워. – object