C ++模板说明

时间:2017-04-21 06:25:41

标签: c++ c++11 template-specialization partial-ordering

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

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

2 个答案:

答案 0 :(得分: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))匹配的列表。 / p>

根据您引用的内容,完整的专业化是更专业化的#34;比部分专业化。

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

还有人认为完全专业化比通用版更专业化。

答案 1 :(得分:0)

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

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

&#34;如果每个与X指定的参数列表匹配的参数列表也与Y指定的参数列表匹配,则模板X比模板Y更专业,而不是相反。&#34;

// 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更专业。