我有幾個函數。將幾個回調函數作爲函數參數
void a();
bool b();
void c(int x, int y);
一個函數whats看起來像那樣。
void setListener(void * listenerCallback);
我必須發送所有這些函數(a,b,c)作爲「setListener」函數的參數。
setListener(&a);
setListener(&b);
setListener(&c);
我該如何做到這一點而不會重載setListener函數?
我找到一個變體。雖然我認爲他可能會造成記憶問題。但事實上,和倫丁解決問題一樣,只有沒有聯盟。
typedef unsigned int varCallback;
enum callbackType {
C_VOID,
C_BOOL,
C_VOID_INT_INT,
}
void setListener(varCallback callbackPointerAddress, callbackType type) {
/// code
}
void a() {};
bool b() {};
void c(int x, int y) {};
setListener((varCallback)&a, C_VOID);
setListener((varCallback)&b, C_BOOL);
setListener((varCallback)&c, C_VOID_INT_INT);
請注意,函數指針不一定與數據指針的大小相同。另外,請確保使用某種類型的代碼來確定每個函數具有的參數列表。見倫丁的回答,它同時回答了兩個問題。 –
你在C或C++中執行此操作嗎?每個人都會得到非常非常不同的答案。請注意,C不支持函數重載。另外,在設計回調函數時,通常會強制執行某個函數簽名(或者至少限制可能性)。你想'setListener()'接受任意簽名的函數嗎?或者是否只有'setListener()'將接受的某些函數簽名集? –
爲了什麼是值得的(現在你有幾個工作答案),我不得不說這個設計是有缺陷的,容易出錯和違反直覺。 –