> 백엔드 개발 > C++ > 함수 포인터가 필요한 메서드에 Boost::function을 전달하는 방법은 무엇입니까?

함수 포인터가 필요한 메서드에 Boost::function을 전달하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-14 16:44:02
원래의
460명이 탐색했습니다.

How to Pass a Boost::function to a Method Expecting a Function Pointer?

Boost::function에서 일반 함수 포인터 파생

일부 시나리오에서는 Boost::function을 표준을 예상하는 메서드에 전달해야 할 수도 있습니다. 함수 포인터(동일한 서명을 보여줌). 이로 인해 컴파일 오류가 발생할 수 있습니다.

변환 오류

typedef void TriggerProc_type(Variable*, void*);
void InitVariable(TriggerProc_type *proc);
boost::function<void (Variable*, void*)>& triggerProc ...
InitVariable(triggerProc);

// Error: cannot convert parameter 1
로그인 후 복사

Boost::function을 피하고

Boost::function을 제거하고 바인딩된 functor를 참조하면 즉시 유사한 오류가 발생합니다. :

error C2664: 'blah(void (__cdecl *)(type *,void *))' : cannot convert parameter
1 from 'boost::_bi::bind_t<R,F,L>>' to 'void (__cdecl *)(type *,void *)'
로그인 후 복사

제안된 솔루션

일반적으로 인정되는 솔루션 솔루션은 사소한 경우에만 성공적으로 작동하므로 제한적입니다. 보다 효과적인 접근 방식은 콜백 서명을 준수하고 호출할 해당 Boost::function을 확인하고 실행하는 shim 함수를 사용하는 것입니다.

typedef void (*CallbackType)(int x, void* user_data);
void RegisterCallback(CallbackType cb, void* user_data);

void MyCallback(int x, void* userData) {
  boost::function<void(int)> pfn = static_cast<boost::function<void(int)> &>(userData);
  pfn(x);
}

boost::function<void(int)> fn = boost::bind(myFunction(5));
RegisterCallback(MyCallback, &fn);
로그인 후 복사

이 방법은 Boost::function과 Boost::function 간의 호환성을 보장합니다. Boost::bind를 사용하면 C 콜백과의 원활한 통합이 가능합니다. 그러나 콜백 서명에 사용자 데이터 포인터가 없으면 이 접근 방식이 불가능해집니다. 그럼에도 불구하고 이러한 콜백 구조는 본질적으로 실제 적용 및 수정이 제한됩니다.

위 내용은 함수 포인터가 필요한 메서드에 Boost::function을 전달하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿