Si vous avez les fonctions suivantes
int f1(int i);
int f2(int i, int j);
Vous pouvez définir un type de fonction générique comme ce
typedef int (*generic_fp)(void);
Et puis initialiser votre tableau de fonction
generic_fp func_arr[2] = {
(generic_fp) f1,
(generic_fp) f2
};
Mais vous devrez jeter les fonctions de back
int result_f1 = ((f1) func_arr[0]) (2);
int result_f2 = ((f2) func_arr[1]) (1, 2);
De toute évidence, il ne ressemble pas à une bonne façon de construire un programme
Pour rendre le code semble un peu mieux que vous pouvez définir des macros
#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
oublié de mentionner, vous devez également définir un type pour chaque type de fonction
typedef int (*fi)(int); // type for function of one int param
typedef int (*fii)(int, int); // type for function of two int params
Et ensuite coulé stockées des pointeurs vers ces types
int result_f1 = ((fi) func_arr[0]) (2);
int result_f2 = ((fii) func_arr[1]) (1, 2);
Voici un exemple complet
#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;
}
Le code ci-dessus produit la sortie suivante
4, 3
4, 3
Side note, vous devez vérifier 'ch> 2', pas' ch> 4' (ou mieux encore, 'ch> sizeof (fun_ptr_arr)/sizeof (* fun_ptr_arr) -1'). –