C++语言程序设计 求绝对值函教的模板 Include<iostream> using name space std; template<typename 1> 数模板 f abs(f x) return x<0?-*: x int maino int n=-5 运行结果: 5 double d=-55 5.5 cout<<abs(n)<<endl cout<<abs(d)<<endl i
C++语言程序设计 6 求绝对值函数的模板 #include<iostream> using namespace std; template<typename T> T abs(T x) { return x<0?-x:x; } int main() { int n=-5; double d=-5.5; cout<<abs(n)<<endl; cout<<abs(d)<<endl; } 函 数 模 板 运行结果: 5 5.5
C++语言程序设计 求绝对值函数的模板分析 编译器从调用abs()时实参的类型,推 数导出函数模板的类型参数。例如,对 于调用表达式abs(n),由于实参n为 模im团,所以推导出模板中类型参数T 为into 板·当类型参数的含义确定后,编译器将 以函数模板为样板,生成一个函数: int abs(int x) i return X<0?X.X;] 大x
C++语言程序设计 7 求绝对值函数的模板分析 ⚫ 编译器从调用abs()时实参的类型,推 导出函数模板的类型参数。例如,对 于调用表达式abs(n),由于实参n为 int型,所以推导出模板中类型参数T 为int。 ⚫ 当类型参数的含义确定后,编译器将 以函数模板为样板,生成一个函数: int abs(int x) { return x<0?-x:x; } 函 数 模 板
C++语言程序设计 重敢函数模板 template<typename T> T max(T a,T b return a>b?a: b: char* max(char* a, char* b) [return(strcmp(a, b>0?a: b);3 x 参考实例演示
C++语言程序设计 8 重载函数模板 template<typename T> T max(T a,T b) { return a>b?a:b; } char* max(char* a, char* b) {return (strcmp(a,b)>0?a:b);} 参考实例演示
C数模板与同名函数量载时的 调用规则 ●先寻找一个参数完全匹配的函数,如果找到了就 调用它; ●如果上面没有找到,则寻找一个函数模板,使其 实例化,产生一个匹配的函数,如果找到了,就 调用它; 如果上面两个调用失败,再试一试低一级的对函 数的重载方法,例如通过类型转换可产生参数匹 配等,如果找到了,就调用它; ●如果上述都失败,则表明这是一个错误的调用
C++语言程序设计 9 函数模板与同名函数重载时的 调用规则 ⚫ 先寻找一个参数完全匹配的函数,如果找到了就 调用它; ⚫ 如果上面没有找到,则寻找一个函数模板,使其 实例化,产生一个匹配的函数,如果找到了,就 调用它; ⚫ 如果上面两个调用失败,再试一试低一级的对函 数的重载方法,例如通过类型转换可产生参数匹 配等,如果找到了,就调用它; ⚫ 如果上述都失败,则表明这是一个错误的调用
C++语言程序设计 重敢亟教模板方式 显式重载函数模板 ●显式特化 x
C++语言程序设计 10 重载函数模板方式 ⚫ 显式重载函数模板 ⚫ 显式特化