Bonjour à tous,
J'ai créée un implémentation de foncteurs permettant de stocker des pointeurs de fonctions de tout type. Je vous en donne un extrait :
Voila mon problème : j'aimerai pouvoir stocker ces foncteurs, par exemple dans une list de la stl. Cependant ce n'est pas possible puisque tous les foncteurs sont d'un type différent. Exemple d'utilisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 class NullType {}; class Functor {}; template <class R = void(), class C = NullType> struct Function; /* Fonctions libres sans paramètre */ template<class R> class Function<R()> : public Functor { private: typedef R (*F)(); public: Function(F f) : m_f(f) {} R operator ()() { return m_f(); } private: F m_f; }; /* [...] */ /* Fonctions membres const à un paramètre */ template <class R, class T1, class C> struct Function<R(C::*)(T1) const, C> : public Functor { private: typedef R (C::*F)(T1) const; public: Function(F f, C c) : m_f(f), m_c(c) {} R operator ()(T1 t1) { return (c.*m_f)(t1); } private: F m_f; C m_c; };
Si tous les foncteurs à stocker sont de type Function<void()> pas de probleme, mais ce n'est pas le cas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void f() {} // une fonction libre Function<void ()> F(&f); // le foncteur qui encapsule cette fonction F(); // et l'utilisation du foncteur qui va appeler f()
J'ai donc pensé à faire hériter les classes Function d'une classe mère commune Functor. Dans ce cas on peux effectivement stocker n'importe quel type de foncteurs (en utilisant le polymorphisme) mais il faudra alors faire un reinterpret_cast pour l'utiliser; de plus on perd les paramètres template (d'où le reinterpret_cast) :
Voila, j'espère avoir été assez clair. Est-ce que vous auriez une solution pour stocker ces foncteurs ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 /* en reprennant le bout de code précédent : */ Functor* Foncteur = &F; /* pour l'utiliser : */ (reinterpret_cast<Function<void()>*>(Foncteur))()
Merci d'avance.
Partager