2017-10-12 110 views
0

我寫了一個C++的宏包的兩個通用功能的執行:如何在C++宏轉換爲更優雅的解決方案

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

使用示例:

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

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

我想更換這個代碼更優雅些。你認爲模板可以幫助我嗎?任何其他想法?

謝謝。

+1

在C++ 11中,我會簡單地刪除宏。來想一想,我不知道這個動作需要什麼特定的C++ 11。 –

+2

如果這是實際的代碼:直接刪除宏。它沒有附加價值。 @CrazyEddie:GMTA – MSalters

回答

3

普通模板應該足夠設施,因爲沒有什麼可變參數關於您的問題:

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

在通話的網站,你可以使用lambda表達式生成可調用的對象:

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

你可以還要看std :: bind以在安裝時修復這些參數。