函数模板部分排序(C++)
匹配的多个函数模板参数列表的函数调用可以可用。 C++ 定义一个函数模板部分排序指定应调用哪个函数。 排序是部分,因为可以被视为等效专用化的某些模板。
编译器从可能的匹配选择可用专用模板中的功能。 例如,因此,如果函数模板采用类型 T和另一个函数模板采用 T* 可用, T* 版本被视为专用它优于泛型 T 版本,只要参数是指针类型,因此,即使它们都是允许的匹配。
使用以下过程来确定一个函数模板候选是否是专用:
考虑两个函数模板, T1 和 T2。
用一个假设唯一类型 X. 替换在 T1 的参数。
参数在 T1,请参见 T2 是否是一个有效的模板参数列表。 忽略任何隐式转换。
重复相同的过程与反转的 T1 和 T2。
如果一个模板是有效的模板为另一个模板参数列表,但是,并不为 true,则模板大于另一个模板视为专用。 如果使用上述步骤的模板窗体之间的有效参数,则会将它们视为等效专用化,因此,不明确调用将发生,当尝试使用它们。
使用下列规则:
特定类型的模板专用化比采用泛型类型参数的一种专用。
只采用 T* 的模板比只采用 T的一个是专用,,因为一个假设类型 X* 是 T 模板参数的有效参数,但是, x 不是 T* 模板参数的有效参数。
const T 比 T是专用,,因为 const x 是 T 模板参数的有效参数,但是, x 不是 const T 模板参数的有效参数。
const T* 比 **T***是专用,,因为 const X* 是 T* 模板参数的有效参数,但是, X* 不是 const T* 模板参数的有效参数。
下面的示例在 Visual C++ .NET 2003 中工作在该标准上指定:
// partial_ordering_of_function_templates.cpp
// compile with: /EHsc
#include <iostream>
extern "C" int printf(const char*,...);
template <class T> void f(T) {
printf_s("Less specialized function called\n");
}
template <class T> void f(T*) {
printf_s("More specialized function called\n");
}
template <class T> void f(const T*) {
printf_s("Even more specialized function for const T*\n");
}
int main() {
int i =0;
const int j = 0;
int *pi = &i;
const int *cpi = &j;
f(i); // Calls less specialized function.
f(pi); // Calls more specialized function.
f(cpi); // Calls even more specialized function.
// Without partial ordering, these calls would be ambiguous.
}
Output
Less specialized function called
More specialized function called
Even more specialized function for const T*