C++模板编程
1,模板函数
像max这种函数,对于参数类型,计算逻辑是一样的,只是入参和返回值类型不同,就可以写成模板函数。
示例:
-
#include<iostream>
-
using namespace std;
-
-
template<typename T>
-
T maxmax(T a, T b)
-
{
-
return (a > b ? a : b) + 1;
-
}
-
-
int main()
-
{
-
cout << maxmax(1, 2) << endl;
-
cout << maxmax(1.3, 1.5) << endl;
-
cout << maxmax("as", "zx");
-
return 0;
-
}
输出:
3
2.5
s
但是,不能这么调用:maxmax(1.3,1),这样写会报错
不同于普通函数,这里不能自动把int转换为double
2,多类型参数的模板函数
要实现有不同数据类型的入参的函数,就需要多个模板参数。
示例:
-
#include<iostream>
-
using namespace std;
-
-
template<typename T1,typename T2>
-
T1 maxmax(T1 a, T2 b)
-
{
-
return (a > b ? a : b) + 1;
-
}
-
-
int main()
-
{
-
cout << maxmax(1, 2) << endl;
-
cout << maxmax(1.3, 1.5) << endl;
-
cout << maxmax(1.3, 1) << endl;
-
cout << maxmax("as", "zx");
-
return 0;
-
}
输出:
3
2.5
2.3
s
3,模板类
和模板函数语法差不多。
示例:
-
#include<iostream>
-
using namespace std;
-
-
template<typename T>
-
class GetMax
-
{
-
public:
-
T a;
-
T b;
-
GetMax(T a, T b)
-
{
-
this->a, this->b = b;
-
}
-
T getMax()
-
{
-
return a > b ? a : b;
-
}
-
};
-
-
int main()
-
{
-
int a = 1;
-
cout << GetMax<double>(a, 2.3).getMax();
-
return 0;
-
}
有个很重要的区别就是,模板类在调用的时候必须显示的指明类型参数,
所以这里就像普通函数一样,会自动把int类型的数转换为double的数。
4,多类型参数的模板类
示例:
-
#include<iostream>
-
using namespace std;
-
-
template<typename T1,typename T2>
-
class GetMax
-
{
-
public:
-
T1 a;
-
T2 b;
-
GetMax(T1 a, T2 b)
-
{
-
this->a, this->b = b;
-
}
-
T1 getMax()
-
{
-
return a > b ? a : b;
-
}
-
};
-
-
int main()
-
{
-
int a = 1;
-
cout << GetMax<int, double>(a, 3.3).getMax() << endl;
-
cout << GetMax<double,int>(a, 3.3).getMax();
-
return 0;
-
}
输出:
3
3
5,默认类型
模板类定义时,类型参数可以指定默认类型。
模板函数不能指定默认类型。
6,非类型参数
在定义模板类时,参数列表除了类型参数还可以有变量参数。
示例:
-
#include<iostream>
-
using namespace std;
-
-
template<typename T,int len>
-
class Num
-
{
-
public:
-
Num(T a)
-
{
-
this->num[0] = a;
-
}
-
T get()
-
{
-
return num[0];
-
}
-
private:
-
T num[len];
-
};
-
-
int main()
-
{
-
cout << Num<int, 1>(2.3).get();
-
return 0;
-
}
输出:
2
注意,创建模板类实例时,变量参数只能传常量,不能传变量,即使模板类中没有使用这个参数也是这样。
7,可继承性
模板类可以继承模板类,模板类可以继承非模板类,
非模板类可以继承模板类,非模板类可以继承非模板类。
8,友元
友元的使用,对于模板类和非模板类是一样的。
9,静态成员
对于模板类中的静态成员,每个模板特例化都拥有独立的静态数据域拷贝。
文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/nameofcsdn/article/details/104628485
- 点赞
- 收藏
- 关注作者
评论(0)