2015-12-02 69 views
0
//function wapper 
template<class F,typename...Args> 
class FuncWrapper 
{ 
private: 
    //F return type 
    using return_type = typename std::result_of<F(Args...)>::type; 

    template<int ...S> struct IndexSeq {}; 
    template<int N, int ...S> struct makeSeq : makeSeq<N - 1, N - 1, S...> {}; 
    template<int ...S> struct makeSeq<0, S...> : IndexSeq<S...> {}; 


public: 
    FuncWrapper(F &&func,Args&&...args): 
     f(std::move(std::function<return_type(Args...)>(std::forward<F>(func)))), 
     para(std::make_tuple<Args...>(std::forward<Args>(args)...)) 
    {} 
    ~FuncWrapper() = default; 

    template <int... INDEX> 
    return_type delay_action(makeSeq<INDEX...>) 
    { 
     return f(std::get<INDEX>(para)...); 
    } 

    // 
    return_type operator()() 
    { 
     return delay_action(makeSeq<sizeof...(Args)>{}); 
    } 

private: 
    //function 
    std::function<return_type(Args...)> f; 
    //parameter in the tuple 
    std::tuple<Args...> para; 
}; 

template<class F,typename ...Args> 
FuncWrapper<F,Args...> make_function_wapper(F &&f, Args&&...args) 
{ 
    return FuncWrapper<F, Args...>(std::forward<F>(f), std::forward<Args>(args)...); 
} 

這裏是一個問題:我想爲包裝函數創建一個模板類,併爲參數存儲使用元組,但它似乎不能很好地工作,我無法找到原因。 所以我需要一些幫助,誰可以解釋它。 thx爲您的幫助!如何在C++ 11中解封裝函數參數的元組?

+0

是否有理由不能使用C++ 14的['index_sequence'](http://en.cppreference.com/w/cpp/utility/integer_sequence)而不是您自己的'IndexSeq'? –

+1

@JonathanWakely:可能是因爲它被標記爲C++ 11(並在標題中重複)。 – Jarod42

+0

@ Jarod42,但仍然可以在C++ 11中使用'integer_sequence',例如[integer_seq.h](https://gitlab.com/redistd/integer_seq/blob/master/integer_seq.h)。這將是「前向兼容」,而不是重新發明輪子,用不同的拼寫。 –

回答

1

下面的代碼:

template <int... INDEX> 
return_type delay_action(makeSeq<INDEX...>) 
{ 
    return f(std::get<INDEX>(para)...); 
} 

應該是:

template <int... INDEX> 
return_type delay_action(IndexSeq<INDEX...>) 
//      ~~~~~~~^ 
{ 
    return f(std::get<INDEX>(para)...); 
} 

您使用的是最底層派生makeSeq<2>類最終從IndexSeq<0, 1>繼承序列發生器,以及你背後的想法想要推斷的是來自IndexSeq的一系列數字,而不是來自makeSeq本身的序列的長度。

你也應該注意到,ArgsFuncWrapper就可以了(可能是CV-合格)左值引用類型的,這樣的論據安全地存儲在一個元組,元組的聲明應該如下:

std::tuple<typename std::decay<Args>::type...> para; 
//     ~~~~~~~~~^ 
+0

另一個問題是函數的預期行爲是什麼,比如'void foo(std :: unique_ptr )'。 – Jarod42

+0

@ Jarod42謝謝你提醒,我只是在做一個練習,而沒有深入考慮它。 – user5570258