2011-01-10 5 views
3

두 개의 인수 => 콜백 함수 및 콜백 함수에 대한 인수를 취하는 functionA가 있습니다. 콜백의 인수는 int 또는 사용자 정의 유형과 같은 유형으로 빌드 될 수 있습니다. 어떻게 함수를 선언 할 수 있습니까?콜백 함수에 대한 전달 매개 변수

eg: 
void functionA(void (*handler)(TYPEA), TYPEA variableA) 
{ 
    *handler(variableA); 
} 

TYPEA는 기본 제공 유형 또는 사용자 정의 유형일 수 있습니다. 처리기에서 dynamic_casting을 사용하여 typeA를 적절한 유형으로 캐스팅해야 콜백 함수를 사용할 수 있습니다 (이 경우 typeA는 무엇입니까?)이 경우 템플릿을 사용해야합니까?

+0

'functionA'는 'handler'를 호출하는 것 이외의 다른 인수에 대해 두 번째 인수를 사용합니까? –

답변

1

TYPEA는 유형 또는 사용자 정의 유형일 수 있습니다.

콜백 함수의 인수 유형이 무엇이든간에 함수 템플릿을 원한다고 생각합니다!

template<class T> 
void function(void (*handler)(T), T variable) 
{ 
    handler(variable); 
} 
3

당신은 다음과 같이 전달할 수 있습니다 : 함수가 콜백에 대한 이외의 인수를 사용하지 않는

#include <iostream> 

template< typename A, typename B > 
void foo(A a, B b) 
{ 
    a(b); 
} 

void boo1(const int p) 
{ 
    std::cout<<"boo(" << p << ")" << std::endl; 
} 

void boo2(const std::string p) 
{ 
    std::cout<<"boo(" << p << ")" << std::endl; 
} 


int main() 
{ 
    foo(boo1, 3); 
    foo(boo2, "abc"); 
} 
+0

함수 호출 전에 역 참조가 필요하지 않으며'operator()'를 오버로드하는 클래스의 사용을 금지 할 수 있습니다. –

+0

왜? 펑터 자체가 될지, 펑터를 가리키는 포인터인지를 선택하는 것이 아닙니다. – user168715

+1

나는 @Chris Lutz에 동의한다. @ user168715 : 거기에'*'를 추가하고 (함수 포인터 대신에) 펑터를 사용하기를 원한다면, 먼저 펑터를 만들고 호출 주소를 추출해야합니다. '*'가 없으면, 펑터를 제자리에 만들 수 있습니다. 즉, 특별한 이유없이 functor의 경우 사용자 코드를 작성하기가 더 어렵습니다. –

2

경우에, 나는 완전히 콜백을 제거하는 것입니다 :

// c++0x, same can be achieved with boost::function/boost::bind in c++03 
void function(std::function< void (void) > f) 
{ 
    f(); 
} 
void callback1(int); 
void callback2(Type); 
//void callback3(double); 
void user_code() { 
    function(std::bind(callback1, 5)); 
    function(std::bind(callback2, Type(1, 2, 3, 4)); 
    // function(std::bind(callback3, 5.0); 
} 

function 내부에서 전달 된 인수 (none) 만있는 일반 펑터 (std::function)를 사용하면 콜백에서 함수를 분리합니다. 이제 모든 유형을 전달할 수 있으며 호출자는 bind 콜백 값 (즉, 콜백 인수는 function의 책임이 아니며 function은 유형이나 값에 대해 알아야합니다.)까지 호출자에게 전달됩니다.