私はいくつかの関数を持っています。複数のコールバックを関数パラメータとして投稿する
void a();
bool b();
void c(int x, int y);
1つの機能はそれに似ています。
void setListener(void * listenerCallback);
この関数(a、b、c)をすべて "setListener"関数のパラメータとして送信する必要があります。
setListener(&a);
setListener(&b);
setListener(&c);
これを行うには、setListener関数をオーバーロードしないでください。
私は1つの亜種を見つける。私は彼が記憶に問題を引き起こしているかもしれないと思うが。しかし実際には、それはLundinの解法と同じであり、組合がない場合のみです。
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);
関数ポインタはデータポインタと同じサイズである必要はないことに注意してください。また、ある種のコードを使用して、各関数がどのような引数リストを持っているかを確認してください。 Lundinの答えを参照してください、それはすぐに問題の両方に答える。 –
CやC++でこれをやっていますか?それぞれに非常に異なる回答が得られます。 Cは関数の多重定義をサポートしていないことに注意してください。また、コールバックを設計するときには、通常、特定の関数シグネチャを適用します(または、可能性を制限する)。 'setListener()'が任意の署名の関数を受け入れるようにしますか?あるいは、 'setListener()'が受け入れる特定の関数シグネチャのセットしかありませんか? –
これは価値があります(今、あなたは2つの作業の答えがあります)。この設計には欠陥があり、誤りが多く、直観に反しやすいと言わなければなりません。 –