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应该是一个“普通”函数指针。

回答

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

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

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

如何'FType'去推断?或者你打算明确指定它?如果是这样,你可能只需指定返回类型... –