有人能给我解释一下关于C++模板中的“偏序”的下面几行吗?“如果与X指定的参数列表匹配的每个参数列表也与Y指定的参数列表匹配,那么模板X比模板Y更专业,但反之亦然。”
我搞不懂这句话的意思。
发布于 2017-04-21 19:41:57
我试着用一个例子来解释它。
请看下面的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-21 19:59:20
// 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更加专门化。
https://stackoverflow.com/questions/43535379
复制相似问题