1

次の形式の可変個引数マクロを指定します。

#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は「プレーンな」関数ポインターであると想定されていることに注意してください。

4

2 に答える 2

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)...);
}
于 2011-08-23T17:40:30.163 に答える
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...);
}
于 2011-08-23T13:39:56.453 に答える