Wenn Sie die folgenden Funktionen
int f1(int i);
int f2(int i, int j);
haben, können Sie eine generische Funktionstyp definieren wie diese
typedef int (*generic_fp)(void);
Und dann Ihre Funktion Array initialisieren
generic_fp func_arr[2] = {
(generic_fp) f1,
(generic_fp) f2
};
Aber Sie werden die Funktionen zurück
int result_f1 = ((f1) func_arr[0]) (2);
int result_f2 = ((f2) func_arr[1]) (1, 2);
Offensichtlich zu werfen haben, ist es wie ein guter Weg sieht nicht ein Programm
Um Code ein wenig besser aussehen bauen Sie Makros definieren
#define F1(f, p1) ((f1)(f))(p1)
#define F2(f, p1, p2) ((f2)(f))(p1, p2)
int result_f1 = F1(func_arr[0], 2);
int result_f2 = F2(func_arr[1], 1, 2);
EDIT
vergessen zu erwähnen, müssen Sie auch einen Typ für jeden definieren Art der Funktion
typedef int (*fi)(int); // type for function of one int param
typedef int (*fii)(int, int); // type for function of two int params
Und gieße dann gespeichert Zeiger auf diese Typen
int result_f1 = ((fi) func_arr[0]) (2);
int result_f2 = ((fii) func_arr[1]) (1, 2);
hier ein komplettes Beispiel
#include <iostream>
typedef int (*generic_fp)(void);
typedef int (*fi)(int); // type for function of one int param
typedef int (*fii)(int, int); // type for function of two int params
#define F1(f, p1) ((fi)(f))(p1)
#define F2(f, p1, p2) ((fii)(f))(p1, p2)
int f1(int i);
int f2(int i, int j);
int main()
{
generic_fp func_arr[2] = {
(generic_fp) f1,
(generic_fp) f2
};
int result_f1_no_macro = ((fi) func_arr[0]) (2);
int result_f2_no_macro = ((fii) func_arr[1]) (1, 2);
int result_f1_macro = F1(func_arr[0], 2);
int result_f2_macro = F2(func_arr[1], 1, 2);
std::cout << result_f1_no_macro << ", " << result_f2_no_macro << std::endl;
std::cout << result_f1_macro << ", " << result_f2_macro << std::endl;
return 0;
}
int f1(int i)
{
return i * 2;
}
int f2(int i, int j)
{
return i + j;
}
Der obige Code wird die folgende Ausgabe
4, 3
4, 3
produziert
Randbemerkung, sollten Sie prüfen, 'ch> 2', nicht' ch> 4 '(oder besser noch,' ch> sizeof (fun_ptr_arr)/sizeof (* fun_ptr_arr) -1'). –