2017-10-12 6 views
0

j'ai écrit un C++ macro pour envelopper l'exécution de deux fonctions génériques:Comment convertir un C++ macro à une plus élégante solution

#define DO_ACTIONS(action1, action2, handle) \ 
    ResetEvent(handle);      \ 
    action1         \ 
    action2         \ 
    // other common stuff... 

Exemples d'utilisation:

DO_ACTIONS(function1(1, 2, 3);, 
      function2();, 
      m_handleEvent); 

DO_ACTIONS(function1("some text");, 
      function2(-3);, 
      m_handleEvent); 

Je voudrais remplacer ce code avec quelque chose de plus élégant. Pensez-vous que les modèles peuvent m'aider avec ça? Une autre idée?

Merci.

+1

En C++ 11, je supprimerais simplement la macro. En y réfléchissant, je ne sais pas que l'action nécessite quelque chose de spécifique à C++ 11. –

+2

S'il s'agit du code actuel: supprimez simplement la macro. Il n'a pas de valeur ajoutée. @CrazyEddie: GMTA – MSalters

Répondre

3

modèles ordinaires devraient suffire pour l'installation, car il n'y a rien variadique au sujet de votre problème:

template <typename F1, typename F2> 
void do_actions(F1 f1, F2 f2, handle_type handle) 
{ 
    ResetEvent(handle); 
    f1(); 
    f2(); 
} 

Sur le site d'appel, vous pouvez utiliser des expressions lambda pour générer des objets appelables:

do_actions([](){ function1(1, 2,3); }, 
      [](){ function2(); }, 
      m_handleEvent); 
0

Vous pourriez regardez aussi std :: bind pour corriger ces arguments au moment de l'installation.