如何将C ++宏转换为更优雅的解决方案

时间:2017-10-12 22:53:08

标签: c++ templates macros

我写了一个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 );

我想用更优雅的东西替换这段代码。你认为模板可以帮助我吗?还有其他想法吗?

感谢。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您还可以查看std :: bind以在设置时修复这些参数。