2013-05-30 21 views
0

可以說我有類型的空隙的作用在C++如何將函數推入C++數組中?

例如:

void fun1(); 
void fun2(); 
void fun3(); 

如何可以推這些功能到一個數組? 如:

array[0] = fun1(); 
array[1] = fun2(); 
array[2] = fun3(); 
+0

這些函數的類型是void(*)(),而不是void。 – jrok

+4

一個不會「推」到陣列上...... – crashmstr

回答

8

在C.

使用函數指針
void (*array[2])(); 
array[0] = fun1; 
array[1] = fun2; 

或者std::function在C++:

std::function<void(void)> fn1 = fun1; 
std::function<void(void)> fn2 = fun2; 
std::vector<std::function<void(void)> > v; 
v.push_back(fn1); 
v.push_back(fn2); 
+0

@ RichardJ.RossIII和標籤中的「C」。 – 2013-05-30 19:26:05

+0

和C作爲標籤。 std ::函數真的很好,但經典的函數指針會做。 – Xaqq

+1

'std :: function'工作得很好,但這個答案或原始函數指針沒有問題。你正在肛門@理查德。 –

1
typedef void (*FUNC_PTR)(void); 

FUNC_PTR funcs[3]; 

funcs[0] = func1; 
funcs[1] = func2; 
funcs[2] = func3; 
1

如果職能的簽名都是一樣的,你可以使用功能指針

+1

如果簽名是不同的,那你就搞砸了。 –

2

爲什麼不使用接口模式。

class CallBackInterface { 
    public: 
     virtual void CallBack(); 
}; 

class CallBack1 : public CallBackInterface{ 
    public: 
     virtual void CallBack(); 
    private: 
     int someData; 
}; 

...等

然後使用基本類型

CallBackInterface arr[] = 
{ 
    CallBack1(), 
    callBack2(5, "Hello"), 
    ... 
}; 

每個對象都可以隨身攜帶它想要的任何有效載荷創建陣列 - 那麼你可以做

arr[1].CallBack(); 

調用函數

+2

爲什麼?因爲它使你的代碼變得醜陋而且過於複雜。這不是java :) –

+0

哇,談論錘子... :) – jrok

+0

我認爲它更整潔,也更容易調試。此外,您還添加了編譯器的功能,以檢查是否沒有將錯誤的函數添加到數組中。 –