【问题标题】:How to convert a C++ macro to a more elegant solution [closed]如何将 C++ 宏转换为更优雅的解决方案 [关闭]
【发布时间】:2017-10-12 22:53:07
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 在 C++11 中,我会简单地删除宏。想想看,我不知道这个动作需要任何 C++11 特定的东西。
  • 如果这是实际代码:直接删除宏即可。它没有附加价值。 @CrazyEddie:GMTA

标签: c++ templates macros


【解决方案1】:

普通模板应该足以满足您的问题,因为您的问题没有变数:

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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多