Je suis en train de mettre en place un système de minuterie/callback en utilisant les fastdelegates de Don Clugston. (voir http://www.codeproject.com/KB/cpp/FastDelegate.aspx )
Voici le code de départ :
struct TimerContext
{
};
void free_func( TimerContext* )
{
}
struct Foo
{
void member_func( TimerContext* )
{
}
};
Foo f;
MulticastDelegate< void (TimerContext*) > delegate;
delegate += free_func;
delegate += bind( &Foo::member_func, &f );
D'accord, mais maintenant, je souhaite que l'utilisateur puisse sous-classer TimerContext
de stocker et d'envoyer ses propres structures aux rappels. L'objectif est ici d'éviter à l'utilisateur d'avoir à descendre la balise TimerContext
lui-même
struct TimerContext
{
};
struct MyTimerContext : TimerContext
{
int user_value;
};
void free_func( TimerContext* )
{
}
void free_func2( MyTimerContext* )
{
}
struct Foo
{
void member_func( TimerContext* )
{
}
void member_func2( MyTimerContext* )
{
}
};
Foo f;
MulticastDelegate< void (TimerContext*) > delegate;
delegate += free_func;
delegate += free_func2;
delegate += bind( &Foo::member_func, &f );
delegate += bind( &Foo::member_func2, &f );
Comme vous l'avez deviné, GCC ne me permet pas de le faire :)
error: invalid conversion from `void (*)(MyTimerContext*)' to `void (*)(TimerContext*)'
error: initializing argument 1 of `delegate::Delegate<R ()(Param1)>::Delegate(R (*)(Param1)) [with R = void, Param1 = TimerContext*]'
Ma question est donc la suivante : Si je force la distribution en utilisant reinterpret_cast
Le système fonctionnera, mais sera-t-il sûr ?
PS : Il s'agit de rappels critiques en termes de temps, les solutions lourdes orientées vers le virtuel sont considérées comme impraticables :/