LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 252|回复: 0

函数模板

[复制链接]
发表于 2024-2-18 23:05:10 | 显示全部楼层 |阅读模式
类模板可定义一系列相关类,这些类基于在实例化时传递到类的类型参数。 函数模板类似于类模板,但定义的是一系列函数。 利用函数模板,你可以指定基于相同代码但作用于不同类型或类的函数集。 以下函数模板交换两个项:

// 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 参数的类型。

尽管非模板化函数可以使用 void 指针运行此函数,但模板版本是 typesafe。 请考虑以下调用:

int j = 10;
int k = 18;
CString Hello = "Hello, Windows!";
MySwap( j, k );          //OK
MySwap( j, Hello );      //error
第二个 MySwap 调用触发了编译时错误,因为编译器无法生成具有不同类型的参数的 MySwap 函数。 如果使用了 void 指针,两个函数调用都将正确编译,但函数在运行时无法正常工作。

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

// 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.
}
当显式指定模板参数时,将对函数自变量执行常规隐式转换以将其转换为对应的函数模板自变量的类型。 在上面的示例中,编译器将 j 转换为类型 char。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表