模板的用法
大家好,今天是用法系列的第n+m+1期,讲什么不用说了,标题上写着
模板是一个可定义类型的模型,可以理解为一个模型
1.初步认识
1.前言
模板是一种很有用的工具,假如你要用函数打印3+9,6.95+9.98,'a'+'b'的ASCII值,按照之前的理念,可以这么写
#include <iostream>
using namespace std;
int int_add(int a,int b){
return a + b;
}
int double_add(double a,double b){
return a + b;
}
int char_add(char a,char b){
return a + b;
}
int main(){
cout << int_add(3,9) << endl;
cout << double_add(6.95,9.98) << endl;
cout << char_add('a','b') <<endl;
return 0;
}
但太多重复的代码造成代码冗余,如何解决这个问题呢,当然有办法,那就是模板
2.使用用法
规格:
template<typename 类型1,typename 类型2,typ......>
理论上,你可以使用无数个模板
它可以使用在函数
#include <string>
template<typename T>
int add(T a, T b) {
return a + b;
}
int main() {
using namespace std;
cout << add<int>(3, 9) << endl; //12
cout << add<double>(6.95, 9.98) << endl; //16.93
cout << add<const char>('a', 'b') << endl; //195(ASCII码)
return 0;
}
当然,模板使用时可以不需要转换,某些编译器会自动判断类型
#include <iostream>
template<typename T>
T add(T t1, T t2)
{
return t1 + t2;
}
int main()
{
using namespace std;
cout << add<int>(12, 'c') << endl;//'c'的ASCII码为99,111
cout << add(2.8, 7.6) << endl; //隐式转换,10.4
cout << add<int>(12.3,34.5) << endl;//double转换为int,46
cout << add(4, 3); //7
return 0;
}
这里'c'转换成了99(因为模板定义的是int),输出的值只看模板的类型
模板还可以用在类里
#include <iostream>
using namespace std;
template<typename T>
class m {
public:
template<typename U> //模板声明
void Swap(U& a, U& b) { //交换
U c = a;
a = b;
b = c;
}
m(const T arr[5]) { //定义
for (int i = 0; i < 5; i++) {
this->arr[i] = arr[i]; // 修正为逐个元素赋值
}
}
template<typename U> //模板声明
void Sort() { //冒泡排序
int flag;
for (int i = 0; i < 5 - 1; i++) {
for (int j = 0; j < 5 - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
Swap<T>(arr[j], arr[j + 1]);
}
}
}
}
template<typename U>
void Print_array() {
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
}
private:
T arr[5];
};
int main() {
printf("====================\n");
int array[5] = {3,2,5,7,0};
double array2[5] = { 4.5,6.8,7.9,1.2,0.4 };
m<int> myObj(array);
myObj.Sort<int>();
myObj.Print_array<int>();
printf("\n===================\n");
m<double> myObj2(array2);
myObj2.Sort<double>();
myObj2.Print_array<double>();
printf("\n===================");
return 0;
}
我们创建了一个类,模板为T,又写了一些函数,比如Sort(排序),Print_array(打印数组),和Swap(交换)和一个构造函数,构造函数用于定义数组,每个函数使用的模板都是U。之后在main函数创建了两个对象,使用了排序等函数,最后输出
3.注意事项
1.不能把变量,指针,函数名定义为模板名
2.不能在同一个模板创建一个以上参数,就像这样
template(typename T,typename T); //错误
3.当函数模板暂不运用在函数或不在同一个作用域,函数模板要创建多个模板函数时,用typedef货class修饰,否则无法解析,比如
template<typename T1, typename T2>
void printTwoTypes(T1 arg1, T2 arg2) {
std::cout << "第一个参数为: " << arg1 << std::endl;
std::cout << "第二个参数为: " << arg2 << std::endl;
}
是正确的
template<typename T1, typename T2>
只输入是错误的