C++函数模板(1)

C++函数模板(1)

如下代码所示,几个函数间在函数体一致或者是相差不大是时,就是数据类型不一样,如是单独写三个函数,会有一点麻烦,这时,提供一个函数模板(抽离出参数列表中不一样的部分),会使得编写过程不至于枯燥繁琐,也使得后期修改更加方便。

int Max(int a, int b);
int Max(double a, double b);
int Max(int *a, int *b);

函数模板的定义

max的函数模板:

template<typename T>//函数头。尖括号里面的一个或多个标识符表示我们希望推迟决定的数据类型
T max(T a, T b) {//返回类型、参数a和b的类型都是T
 return a > b ? a : b;
}

函数模板,顾名思义就是一个模具,并不是一个函数。

函数模板的实例化

模板的实例化就是给模板一个实际的模板参数。

int main() {
 std::cout << max<int>(1, 2) << std::endl;    //类型模板参数T为int
 std::cout << max<double>(1.1, 2.1) << std::endl; //类型模板参数T为double
 std::cout << max<int>(2, 3) << std::endl;     //类型模板参数T为int
}

max(1, 2) 会生成一个具体的函数1:

int max(int a, int b) {
 return a > b ? a : b;
}

max(1.1, 2.1)跟max(1, 2)一样 会生成一个具体的函数2:

double max(double a, double b) {
 return a > b ? a : b;
}

值得注意的是:max(2, 3) 不会再生成具体函数,而是直接将实际参数传给之前生成的函数1。

其实模板实例化过程中,也可以去掉尖括号及其里面的内容编译器可以根据调用函数模板传递的实际函数参数自动推断出模板参数类型:

int main() {
 std::cout << max(1, 2) << std::endl;    
 std::cout << max(1.1, 2.1) << std::endl;
 std::cout << max(2, 3) << std::endl;   
}

当然这种写法是由局限性的:max(1, 2.1)函数模板里函数形参是同一类型的,而这里的参数类型不一致,所以无法确定模板类型参数是什么类型的。此时就必须使用显示实例化:max1, 2.1).

函数模板和重载

就跟函数重载一样,可以定义和函数模板名同名的函数函数模板

template<typename T>
T min(T m, T n) {
 return m < n ? m : n;
}
template<typename T>
T min(int m, int n) {
 return m < n ? m : n;
}
template<typename T>
T* min(T* m, T* n) {
 return *m < *n ? m : n;
}
int* min(int* m,int* n) {
 return *m < *n ? m : n;
}

就和普通函数重载一样,编译器会根据模板参数或函数参数确定最匹配的实例化函数:

int main() {
 int x = 1, y = 2;
 std::cout << min(x, y) << std::endl;
 //template<typename T>T min(T m, T n)
 std::cout << *min(&x, &y) << std::endl;
 //int* min(int* m,int* n)当普通函数和函数模板都可以精确匹配时,普通函数优先匹配
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值