【问题标题】:Converting a variadic macro to a variadic template function?将可变参数宏转换为可变参数模板函数?
【发布时间】:2011-08-23 13:18:37
【问题描述】:

给定一个可变参数宏的形式:

#define MY_CALL_RETURN_F(FType, FId, ...) \
  if(/*prelude omitted*/) {             \
    FType f = (FType)GetFuncFomId(FId); \
    if(f) {                             \
      return f(__VA_ARGS__);            \
    } else {                            \
      throw invalid_function_id(FId);   \
    }                                   \
  }                                     \
/**/

-- 如何将其重写为可变参数函数模板?

template<typename FType, typename ...Args>
/*return type?*/ tmpl_call_return_f(MyFunId const& FId, /*what goes here?*/)
{
  ...
  FType f = (FType)GetFuncFomId(FId);
  return f(/*what goes here?*/);
  ...
}

更新:我对如何声明 Args 的引用类型特别感兴趣:&amp;&amp;const&amp; 还是什么?

更新:请注意,FType 应该是“普通”函数指针。

【问题讨论】:

    标签: variadic-functions variadic-templates c++11 perfect-forwarding variadic-macros


    【解决方案1】:

    看起来像这样:

    template<typename FType, typename ...Args>
    std::result_of<FType(Args...)>::type tmpl_call_return_f(MyFunId const& FId, Args... &&args)
    {
      FType f = (FType)GetFuncFomId(FId)
      return f(std::forward<Args>(args)...);
    }
    

    【讨论】:

      【解决方案2】:

      如果您将std::function 用作FType,那么这应该可以:

      template <typename FType, typename ...Args>
      typename FType::result_type tmpl_call_return_f(MyFunId const& FId, Args... args) {
        // ...
        return f(args...);
      }
      

      【讨论】:

      • 如何推导出FType?还是您打算明确指定它?如果是这样,您不妨只指定返回类型...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2020-04-21
      • 2012-12-31
      • 2016-12-01
      相关资源
      最近更新 更多