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'去推斷?或者你打算明確指定它?如果是這樣,你可能只需指定返回類型... –