Stockage foncteur (encapsulation de fonctions)
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 :
Code:
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;
}; |
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:
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() |
Si tous les foncteurs à stocker sont de type Function<void()> pas de probleme, mais ce n'est pas le cas.
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) :
Code:
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))() |
Voila, j'espère avoir été assez clair. Est-ce que vous auriez une solution pour stocker ces foncteurs ?
Merci d'avance.