2010-02-25 4 views
17

오류 조건을보고하기위한 콜백 함수로 옵션 boost :: function 인수를 가져오고 싶습니다. 선택적 값으로 만들기 위해 기본값을 사용할 수있는 특별한 값이 있습니까?boost :: function 인수의 기본값은 무엇입니까?

void my_func(int a, int b, t_func_ptr err_callback=NULL) { 

    if (error && (err_callback != NULL)) 
     err_callback(); 

} 

내가 부스트 : : 함수가 함수 포인터를 교체와 비슷한 작업을 수행 할 수 있습니다 내가 할 수있는 일반 함수 포인터와 예를 들어

?

답변

21

0 (C++의 NULL에 해당)을 사용하여 boost :: function 인수의 기본값을 사용하면 빈 함수 객체가 생길 수 있습니다. 당신은 불리언 문맥에서 사용 단순히 그 empty() 메소드를 호출 0과 비교, 또는에 의해 비어있는 경우 테스트 할 수 있습니다

void my_func(int a, int b, boost::function<void()> err_callback = 0) { 
    if (error && err_callback) // tests err_callback by converting to bool 
     err_callback(); 
} 

boost::function 객체는이 점에서 일반 함수 포인터처럼 거의 작동합니다.

+2

완벽한, 그것은 그렇게 쉬운, 감사 거라고 생각하지 않았다! –

11

좋은 특별 값은 기본값 인 boost::function 일 수 있습니다.

비어있는 function은 부울 컨텍스트 (예 : NULL 포인터)에서 false를 평가하거나 empty() 메서드를 사용하여 함수 객체 래퍼에 실제로 함수가 있는지 테스트 할 수 있습니다. boost::function Tutorial을 참조하십시오.

는 다음 코드 샘플입니다 :

#include <boost/function.hpp> 
#include <iostream> 

typedef boost::function<void (int code)> t_err_callback; 

void do_callback(int code) 
{ 
    std::cout << "Error " << code << std::endl; 
} 

void my_func(int a, int b, t_err_callback err_callback=t_err_callback()) 
{ 
    bool error = true; // An error happened 
    int error_code = 15; // Error code 
    if (error && !err_callback.empty()) 
     err_callback(error_code); 
} 

int main() 
{ 
    my_func(0, 0); 
    my_func(0, 0, do_callback); 
} 
+1

나는 내 대답을 테스트 할 때 사용했던 코드와 같기 때문에 이것을 upvote해야한다. :) – efotinis

관련 문제