函数模板

类模板定义基于类型传递给类实例化相关类的系列。 函数模板类似于类模板,但定义函数族。 函数模板,可以在不同的类型或类可以指定基于同一代码的功能,但操作。 以下函数模板交换两个项目:

// function_templates1.cpp
template< class T > void MySwap( T& a, T& b ) {
   T c(a); 
   a = b; 
   b = c;
}
int main() {
}

此代码定义交换参数的值功能系列。 从此模板,可以生成将交换 int 和 long 类型和用户定义的类型的函数。 ,如果类的复制构造函数和赋值运算符正确定义,MySwap 即使将交换类。

此外,在中,因为编译器知道 a 和 b 参数的类型在编译时,函数模板使您交换不同类型的对象。

使用无效的指针,尽管此功能可以由一个 nontemplated 函数执行,,模板版本是类型安全。 考虑以下调用:

int j = 10;
int k = 18;
CString Hello = "Hello, Windows!";
MySwap( j, k );          //OK
MySwap( j, Hello );      //error

,因为编译器无法生成具有不同的类型,参数的一个 MySwap 功能第二 MySwap 调用触发编译时错误。 如果使用了无效的指针,两个函数调用将正确编译,但是,该函数将不能正常工作在运行时。

模板参数的显式指定函数模板的允许范围。 例如:

// function_templates2.cpp
template<class T> void f(T) {}
int main(int j) {
   f<char>(j);   // Generate the specialization f(char).
   // If not explicitly specified, f(int) would be deduced.
}

当模板参数显式指定时,规则隐式转换完成转换函数参数转换为相应的函数模板参数的类型。 在上面的示例中,编译器会将 (char j) 键入 int。

请参见

参考

函数模板实例化

显式实例化

函数模板的显式专用化

其他资源

模板