2017-04-21 75 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更加专业化。