J'ai une fonction Foo et une classe CDelegate.const référence au pointeur de fonction
typedef void (*typeFctPtr)(void*);
void Foo(void* dummy)
{
cout << "Foo\n";
}
class CDelegate
{
public:
CDelegate (const typeFctPtr& f_ref_Wrapper, void* f_pvSubscriber)
: m_ref_Wrapper(f_ref_Wrapper), m_pvSubscriber(f_pvSubscriber)
{
}
inline void operator()() const
{
(*m_ref_Wrapper)(0);
}
inline void operator=(const CInterruptDelegate& D)
{
}
private:
void* m_pvSubscriber;
const typeFctPtr& m_ref_Wrapper;
};
Une deuxième classe a un membre statique static CDelegate m_Delegate;
que j'initialiser en utilisant le constructeur comme ceci:
CInterruptDelegate CSpi1::m_Delegate(FreeFunction, 0);
Je veux appeler Foo
en appelant l'opérateur() de mon objet statique: CSpi1::m_Delegate();
Je reçois une exception à (*m_ref_Wrapper)(0);
Y at-il un problème avec la syntaxe? Je ne suis pas sûr que ce que j'essaie de faire soit possible. J'ai une solution de travail où le constructeur de CDelegate
ne prend pas une référence const d'un pointeur de fonction mais le pointeur de fonction lui-même. Je peux alors appeler la fonction dans l'opérateur() sans problèmes. Je veux utiliser une référence const parce que l'appel de pointeur de fonction ne peut pas être optimisé et j'espère que l'appel via la référence const peut car tout devrait être connu au moment de la compilation.
Avez-vous essayé d'appeler simplement 'm_ref_Wrapper (0);'? – iammilind
Je serais surpris si l'optimiseur est capable de supprimer l'appel indirect avec une référence ou un pointeur. Mais un appel indirect n'est vraiment pas si cher. –
@Cat Plus Plus, j'utilise ce mécanisme pour la gestion des interruptions dans un système embarqué. boost :: function fait tout ce dont j'ai besoin mais est plutôt lent. De plus, le logiciel fonctionne en prenant l'argument comme un pointeur de fonction. Je veux optimiser maintenant en utilisant une référence const ... au moins essayer de :) – Mirco