2013-07-31 102 views
3

我有一個有similiar聲明幾個功能:如何泛型函數指針傳遞作爲參數

int foo(int a); 
int bar(int a); 
int test(int a); 

我的消息處理程序的邏輯是完全一樣的:

void HandleFoo(int a) { 
    process(a); 
    int ret = foo(a); 
    if (ret) 
     print(a); 
} 

void HandleBar(int a) { 
    process(a); 
    int ret = bar(a); 
    if (ret) 
     print(a); 
} 

void HandleTest(int a) { 
    process(a); 
    int ret = test(a); 
    if (ret) 
     print(a); 
} 

所以我想知道是否可以寫出一般功能:

void Handle(int a, func_pointer fn) { 
    process(a); 
    int ret = fn(a); 
    if (ret) 
     print(a); 
} 

fn就像一個可以接受的通用函數指針foobartest

這可能嗎?

順便說一下,目前沒有C + + 11和我的項目中提升,只使用TR1。

+0

'typedef int(* func_pointer)(int)'應該這樣做。然後:'Handle(10,&foo);'例如。 – Nbr44

回答

3

您可以使用模板

例如(不是你的代碼完全):

int add1(int n) { return n+1; } 
int add2(int n) { return n+2; } 

template<typename Adder> 
void AddHandler(int n, Adder adder) 
{ 
    int r = adder(n); 
    std::cout << r << std::endl; 
} 

int main(void) 
{ 
    AddHandler(1, add1); 
    AddHandler(3, add2); 

    return 0; 
} 

此輸出預期:

2 
5 

您可以 看看它住在這裏http://ideone.com/q3FyI5

+0

是的 - 你說得對,今天早上咖啡不夠... – Nim

1

是的。使用

void Handle(int a, int(*func)(int)) { 
    process(a); 
    int ret = (*func)(a); 
} 

使用像這樣:

Handle(some_a, &foo); 

注意:您發佈爲例三個函數返回void,我懷疑一個錯字,並與int取而代之。

2

有輕微的調整

template <typename Functor> 
void Handle(int a) 
{ 
    process(a); 
    int ret = Functor()(a); // <- tweak, instantiate functor and then call 
    if (ret) 
     print(a); 
} 

你可以採取這樣的方法或@聯合國拘留所的,你傳遞給函數轉換職能,仿函數,即

struct foo 
{ 
    int operator()(int a) {} 
}; 
struct bar 
{ 
    int operator()(int a) {} 
}; 
struct test 
{ 
    int operator()(int a) {} 
}; 

那麼前面的方法工作,以電話作爲參數...

+0

你確定這有效嗎?http://ideone.com/dYjZ7D – undu

+0

謝謝。如果我把它放在類中怎麼辦?我試過但編譯器說:error:no對於'A :: Handle(int)'調用的匹配函數,候選者是:'template void A :: Handle(int)',模板參數推演/替換失敗 – Deqing

+0

@undu,我責備不夠咖啡...:) – Nim

0

使用

void Handle(int a, bool(*fn)(int)) { 
    process(a); 
    int ret = fn(a); 
    if (ret) 
     print(a); 
} 

或者,

typedef bool (*func_pointer)(int); 
void Handle(int a, func_pointer fn) { 
    process(a); 
    int ret = fn(a); 
    if (ret) 
     print(a); 
} 
1
typedef int (*fptr)(int) ; 

void Handle(int a, fptr fn) { 
    process(a); 
    int ret = fn(a); 
    if (ret) 
     print(a); 
} 

int main() 
{ 
    Handle(3,foo); 
    Handle(4,bar); 
    Handle(5,test); 
}