2015-04-01 115 views
1

我想做到以下幾點:C++ 11可變參數模板參數擴展

template<typename Func> 
class FunctionWrapper 
{ 
public: 
    typedef decltype(Func()) ReturnType; 
    typedef ... ArgsType; 

    FunctionWrapper(Func func) 
    { 
     func_ = func; 
    } 

    ReturnType operator() (ArgsType args) 
    { 
     return func_(args); 
    } 
private: 
    Func func_; 
}; 

問題是我不知道如何來推斷從Func鍵類型ArgsType。當函數返回/不接受時,我想讓它工作。

的用例將被:

FunctionWrapper<myFunction> wrapper; 
auto result = wrapper(1, 2, 3); 
+0

您可以'運營商()'模板成員函數及其參數轉發到'func_'。 – Lingxi 2015-04-01 14:44:26

+0

@Lingxi有沒有辦法讓它在聲明包裝器時推導出ArgsType? – iggy 2015-04-01 14:46:27

回答

1

你能確定參數和返回operator()類型(S),並使用完美轉發:

template <typename Func> 
class FunctionWrapper 
{ 
    Func func_; 

public: 

    FunctionWrapper(Func func) : func_(func) {} 

    template <typename... Args> 
    auto operator() (Args&&... args) 
     -> decltype(func_(std::forward<Args>(args)...)) { 
     return func_(std::forward<Args>(args)...); 
    } 
}; 
+0

用g ++ - 4.8 -std = C++ 11和下面的例子:'double myFunc(double a){ return a; } FunctionWrapper(myFunc)wrap;'這給了我錯誤:參數包沒有用'...'擴展' – iggy 2015-04-01 15:14:42

+0

@iggy哎呀,那是一個錯字。固定。 – Columbo 2015-04-01 15:15:19

+0

謝謝!但有沒有辦法說這樣的事情: 'auto res = FunctionWrapper(myFunc)(0.0);'沒有得到'錯誤:在'''之前缺少模板參數' – iggy 2015-04-01 15:21:19

0

有做,沒有通用的方法,也不是合乎邏輯的。想想Func重載operator()並接受不同的參數類型的情況。但是,您可以規定Func將其參數類型定義爲實用程序的成員類型,如FunctionWrapper以進行訪問。例如,查看std::function的可能成員類型。