2010-11-28 211 views
6

下面的示例代碼在gcc下編譯並按我的希望工作。它允許我將一個具有函數定義的對象作爲模板參數進行實例化,但是該類能夠在函數中使用不同的類型,就好像它們分別作爲類型模板參數一樣傳遞。函數指針非類型模板參數轉換爲類型模板參數

template<class FuncSignature> class Obj; 

template<class Type1, class Type2> class Obj<Type1 (Type2)> 
{ 
public: 
    Type1 var1; 
    Type2 var2; 
}; 

int main(int argc, char **argv) 
{ 
    Obj<char (int)> A; 
    A.var1 = 'a'; 
    A.var2 = 3; 
} 

即使它似乎工作,我不知道這段代碼在做什麼。爲什麼此代碼可以工作並符合C++標準?

+1

是的,它的法律, 當不確定,我試着http://www.comeaucomputing.com/tryitout/來檢查合規性。它由於部分模板專門化而起作用。 – Anycorn 2010-11-28 15:37:34

+0

使用元編程,您可以使用Boost FunctionTypes庫實際提取有關函數類型(此處爲`char(int)`)的大多數信息:http://www.boost.org/doc/libs/1_45_0/libs/function_types/ doc/html/index.html它可能是硬編碼,但它是一個有趣的閱讀:) – 2010-11-28 20:00:42

回答

7

爲什麼它不工作?實例化與專業化相匹配,該專業化將化合物類型(功能char(int))的組分類型(charint)提取爲Type1Type2

順便說一下,您沒有非類型的模板參數。函數類型是一種類型。如果你有一個非類型模板參數的話,就應該是這樣的:

template <char(int)> 
struct X {}; 

char foobar(int); 

int main() 
{ 
    X<foobar> x; 
} 

或完全模板:

template <class R, class A, R(A)> 
//       ^^^^ 
//      non-type parameter 
struct X {}; 

char foobar(int); 

int main() 
{ 
    X<char, int, foobar> x; 
//    ^^^^^^ 
// a specific function, not type 
} 
3

這個問題是用詞不當,因爲FuncSignature不是非模板參數。

然而,給定的代碼作品專業的(普通)爲一元函數類型類型FuncSignatureType1 (Type2)是一個功能類型,給定類型的Type1Type2)。

所以第一行定義了一個通用模板,線的下一組專門它類型形式Type1 (Type2),它們是參數化的兩種類型,因而專業化具有非空模板參數列表,並且main實例化具體類型爲char (int)的模板(取int並返回char的函數)。

0

是。此代碼符合標準的:)

在的情況下:

Obj<char (int)> 

Type1charType2int。因此,Obj::var1是類型爲char的成員變量,而Obj::var2是類型爲int的成員變量。