2014-05-01 36 views
1

我有非常使用的std ::的result_of,decltype和std ::功能C++ 11 - 得到的result_of,decltype,和性病::功能和可變參數模板一起工作

與可變參數模板的麻煩。

我有下面的函數功能 -

int foo(int a, int b, int c) { 
    std::cout << a << b << c << std::endl; 
    return 0; 
} 

及以下類

template <class T, class... Args> 
class VariadicTest { 
public: 
    VariadicTest(const T& func, Args... args) : func(func) {}; 
private: 
    T func; 
}; 

我想在類的成員保存lambda表達式,

爲這我需要一個std ::函數。

我的問題是如何正確定義std :: function。

此類的用例將看起來像 -

VariadicTest(foo, 1,2,3); 

所以現在我有T = INT __cdecl(INT,INT,int)和參數數量=(INT - 1,INT - 2,INT - 3 )

從這個我想一個成員函數,看上去就像這樣:

std::function<std::result_of<T(Args...)::type(Args...)> 

現在這當然不能編譯,也沒有50元左右其他的東西,我試過了。

基本上我需要此示例的下面的聲明

std::function<int(int,int,int)> _f; 

當然本的並以每個給定T和參數數量被自動化。

+0

你嘗試'的std ::功能<類型名稱的std ::的result_of '或單獨typedef獲取結果類型? –

+0

我不確定我是否理解課堂的要求。它試圖達到什麼目的? –

回答

4

嘗試以下操作:

template <class T, class... Args> 
class VariadicTest { 
public: 
    VariadicTest(const T& func, Args... args) : func(std::bind(func, args...)) {}; 
private: 
    using result_type_t = typename std::result_of<T(Args...)>::type; 
    std::function<result_type_t()> func; 
}; 
+0

@dyp是嗎?它在[Coliru]上編譯(http://coliru.stacked-crooked.com/a/cedc85e569fead57)。好吧,我會改變它。謝謝。 – 0x499602D2

+0

是的:你想用可調用的東西來初始化一個*函數包裝*(成員'func')。參數本身不可調用。請注意,將參數綁定到函數對象將產生可調用*的東西,而不需要任何其他參數*。因此函數類型必須是'result_type()',除非你想傳遞更多的參數。 – dyp

+0

'decltype(std :: declval ()(std :: declval ()...))'可能可以用'typename std :: result_of :: type'替換。當您使用result_of_t = typename std :: result_of :: type;'引入'template 時,它可能變得更具可讀性:'using result_type = result_of_t ;' – dyp