将可变参数宏转换为可变参数模板函数?

时间:2011-08-23 13:18:37

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

给出形式的可变宏:

#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的引用类型:&&const&或什么?

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

2 个答案:

答案 0 :(得分:2)

它看起来像这样:

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

答案 1 :(得分:1)

如果您使用std::function作为FType,那么这应该有效:

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