2011-01-10 203 views
3

我有一個函數A,它接受兩個參數=>回調函數和回調函數的參數。回調的參數可以像int或用戶定義的類型那樣構建。我怎麼能聲明函數A?傳遞迴調函數的參數

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

TYPEA可以是內置類型或用戶定義類型。我應該在處理程序中使用dynamic_casting來將typeA轉換爲基於回調函數的適當類型(在這種情況下,類型A應該是什麼?),還是應該在這種情況下使用模板?

+0

除了調用`handler`,`functionA`是否使用第二個參數? – 2011-01-10 08:49:08

回答

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()`的類。 – 2011-01-10 07:48:18

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內部傳遞的參數(無)的通用仿函數(std::function),您可以將函數從回調中解耦。現在您可以傳遞任何類型,並且調用者可以調用bind回調值(即回調參數不是function的責任,也不需要知道它的類型或值)。