2017-10-12 100 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以在安装时修复这些参数。