2017-04-21 77 views
1

可能有人請解釋一下我下面的線相對於在C++模板中的「偏序」 - 「模板X不是模板Ÿ更專業的,如果符合由X指定的每一個參數列表也與Y所指定的相符,但不是相反。「C++模板解釋

我無法理解這句話的意思。

回答

1

我試着用一個例子來解釋它。

請看下面struct foo

// generic 
template <typename T1, typename T2> 
struct foo 
{ }; 

// partial specialization 
template <typename T2> 
struct foo<int, T2> 
{ }; 

// full specialization 
template <> 
struct foo<int, long> 
{ }; 

有三個版本:一個通用版本,部分專業化和全方位的專業化。

考慮下面的參數列表

1) int, long 
2) int, int 

,並觀察充分和部分特。

列表(1)匹配兩個專業化(與T2等於long)當列表(2)匹配部分特。

與完全特化相匹配的每個參數列表(僅列表(1))與部分特殊化匹配,但存在與部分特殊化(列表(2))匹配的列表,該列表與完全特化不匹配。

根據你引用的句子,完整的專業化比部分專業化「更專業化」。

你也可以看到,部分特比通用版「更專業的」,因爲存在每場比賽的偏特,比賽也通用版(帶T1等於int),那可是列表的列表(long, int,由例如)匹配通用版本,但不匹配部分專業化。

這也是obviuos,完整的專業化是更專業的通用版本。

+0

感謝您的寶貴意見。 –

0
// Y 
template <typename T1, typename T2> 
struct foo {}; 

// X 
template <typename T> 
struct foo<int, T> {}; 

「模板X不是模板Ÿ更專業的,如果符合由X指定的每一個參數列表也匹配一個由Y指定的,而不是周圍的其他方式。」

// Imagine all possible argument lists for X. They will always match Y. 
foo<int, int> f1; 
foo<int, double> f2; 
foo<int, my_object> f3; 
/* ... */ 

// Imagine all possible argument lists for Y. They will not always match X. 
foo<double, int> f4; 
foo<int, double> f5; 
foo<char, my_object> f6; 
/* ... */ 

因此,XY更加專業化。