函数模板部分排序(C++)

匹配的多个函数模板参数列表的函数调用可以可用。 C++ 定义一个函数模板部分排序指定应调用哪个函数。 排序是部分,因为可以被视为等效专用化的某些模板。

编译器从可能的匹配选择可用专用模板中的功能。 例如,因此,如果函数模板采用类型 T和另一个函数模板采用 T* 可用, T* 版本被视为专用它优于泛型 T 版本,只要参数是指针类型,因此,即使它们都是允许的匹配。

使用以下过程来确定一个函数模板候选是否是专用:

  1. 考虑两个函数模板, T1 和 T2。

  2. 用一个假设唯一类型 X. 替换在 T1 的参数。

  3. 参数在 T1,请参见 T2 是否是一个有效的模板参数列表。 忽略任何隐式转换。

  4. 重复相同的过程与反转的 T1 和 T2。

  5. 如果一个模板是有效的模板为另一个模板参数列表,但是,并不为 true,则模板大于另一个模板视为专用。 如果使用上述步骤的模板窗体之间的有效参数,则会将它们视为等效专用化,因此,不明确调用将发生,当尝试使用它们。

  6. 使用下列规则:

    1. 特定类型的模板专用化比采用泛型类型参数的一种专用。

    2. 只采用 T* 的模板比只采用 T的一个是专用,,因为一个假设类型 X*T 模板参数的有效参数,但是, x 不是 T* 模板参数的有效参数。

    3. const TT是专用,,因为 const xT 模板参数的有效参数,但是, x 不是 const T 模板参数的有效参数。

    4. const T* 比 **T***是专用,,因为 const X*T* 模板参数的有效参数,但是, X* 不是 const T* 模板参数的有效参数。

  7. 下面的示例在 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.
}

zaycz069.collapse_all(zh-cn,VS.110).gifOutput

Less specialized function called
More specialized function called
Even more specialized function for const T*

请参见

参考

函数模板