有人可以解释一下以下关于模板中"部分排序"C++行吗 - "如果与 X 指定的参数列表匹配的每个参数列表也与 Y 指定的参数列表匹配,则模板 X 比模板 Y 更专业,但相反。">
我无法理解这句话的意思。
我尝试用一个例子来解释它。
请看下面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
并观察全部和部分专业化。
当列表 (2)仅匹配部分专业化时,列表 (1) 匹配两个专业(T2
等于long
)。
与完全专用化匹配的每个参数列表(仅列表 (1))都与部分专用化匹配,但存在与完全专用化不匹配的部分专用化(列表 (2))匹配的列表。
根据你引用的行,完全专业化比部分专业化"更专业化"。
您还可以看到,部分专用化比通用版本"更专业",因为与部分专用化匹配的每个列表也与通用版本(T1
等于int
)匹配,但存在一个列表(例如long, int
)与通用版本匹配但与部分专用化不匹配。
同样值得注意的是,完全专业化比通用版本更专业。
// Y
template <typename T1, typename T2>
struct foo {};
// X
template <typename T>
struct foo<int, T> {};
"如果与 X 指定的参数列表匹配的每个参数列表也与 Y 指定的参数列表匹配,则模板 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;
/* ... */
因此,X
比Y
更专业。