1

有人可以向我解释一下关于 C++ 模板中“部分排序”的以下几行——“如果与 X 指定的参数列表匹配的每个参数列表也与 Y 指定的参数列表匹配,则模板 X 比模板 Y 更专业,但反之则不然。”

我无法理解这句话的意思。

4

2 回答 2

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

并观察全部和部分专业化。

当列表 (2)匹配部分特化时,列表 (1) 匹配两个特化(T2等于) 。long

每个与完全特化匹配的参数列表(仅列表 (1))与部分特化匹配,但存在一个与不匹配完全特化的部分特化(列表 (2))匹配的列表。

根据您引用的行,完全专业化比部分专业化“更专业”。

您还可以看到,部分特化比通用版本“更专业”,因为与部分特化匹配的每个列表也匹配通用版本(T1等于int)但存在long, int与通用版本匹配的列表(例如)但与部分专业化不匹配。

同样明显的是,完全专业化比通用版本更专业化。

于 2017-04-21T11:41:56.660 回答
0
// 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

于 2017-04-21T11:59:20.193 回答