2014-06-13 39 views
1

我想了解如何在C++ 11中實現std::packaged_task將函數原型發送到模板如何工作?

我寫一個簡單的類:

template<typename _Signature> 
    class package; 
template<typename _Res, typename... _ArgTypes> 
    class package<_Res(_ArgTypes...)> 
    { 

    }; 
int main() 
{ 
    package<int(int,int)> a; 
} 

我的問題是:

當我們發送int(int,int)作爲模板參數,並編譯推斷什麼類型?這個例子中_Res的類型是什麼?是lambda還是std::function還是別的?

什麼是_Res(_ArgTypes...)的類型?

在C++之前11我們沒有像int(int,int)之類的東西,在C++ 11中可能如何?

+0

不應該int(int,int)爲int(*)(int,int)'? –

+0

@πάνταῥεῖno我測試它,它工作正常 – Omid

+0

@πάνταῥεῖ看到這個網站的例子:http://en.cppreference.com/w/cpp/thread/packaged_task – Omid

回答

3

的問題是奇怪,因爲編譯器不具有演繹類型爲int(int,int),它一個類型本身。函數類型要精確。這在C++ 11中並不新鮮,它也存在於C++ 98中。請注意,有一個功能類型和類型,是一個指針或引用的功能類型之間的差:

#include <type_traits> 

int foo(int, int) 
{ 
    return 0; 
} 

int main() 
{ 
    using F = int(int,int); 
    F* f1 = &foo; 
    F& f2 = foo; 
    f1(1, 2); 
    f2(2, 3); 

    static_assert(std::is_same< decltype(foo), int(int,int) >::value, "Oops"); 
    static_assert(std::is_same< decltype(&foo), int(*)(int,int) >::value, "Oops"); 
    static_assert(std::is_same< decltype(*&foo), int(&)(int,int) >::value, "Oops"); 

    static_assert(! std::is_same< decltype(foo), int(*)(int,int) >::value, "Oops"); 
    static_assert(! std::is_same< decltype(foo), int(&)(int,int) >::value, "Oops"); 
} 

在您的例子中,專門化必須根據_Res_ArgTypes其中_Res是的結果類型函數類型(int)和_ArgTypes是一個參數包,包含兩種類型(均爲int),從函數類型的參數列表推導出來。

+0

tnx我不知道int(int,int)是一個類型。 :) – Omid

+1

@xyz它是一種類型,但它是一種無法實例化爲該類型的變量的類型。有點像'void'不能。 – Yakk

+0

@Yakk雖然它可以用來聲明一個函數,參見[這裏](http://coliru.stacked-crooked.com/a/418211d0f39113b4)。 –

相關問題