J'ai une interface où je doivent transmet des pointeurs de fonctions membres qui sont statiquement castés vers un pointeur de base et stockés dans notre dos en tant que pointeur void et type d'invocation ( mfc tables des messages ).
J'ai créé un wrapper qui gère les exceptions (try/catch très simple pour attraper std::runtime_error) car il est fastidieux et source d'erreurs de le maintenir dans chaque callback de l'utilisateur.
Jusqu'à présent, le wrapper suivant fonctionne assez bien ( L'idée est de saisir le pointeur de la fonction membre directement en tant que paramètre du modèle de valeur - ce qui revient à donner une fonction membre enveloppante pour chacune des fonctions de rappel) :
class MyClass : public CWnd/*example*/{
public:
template<void (MyClass::*f)(CCmdUI*)>
void Dispatch(CCmdUI* pCmdUI) {
try {
(this->*f)(pCmdUI);
}
catch (std::runtime_error& e) {
//handle error
}
}
};
Mais pour éviter d'avoir une surcharge explicite pour chaque type d'appel, serait-il possible de paramétrer la liste des arguments ?
Illustration ( Remarque : cela ne fonctionne pas. ) :
template<void (MyClass::*f)(Args...)>
void Dispatch(Args... args) {