目录
模板简要
template<typename T>
template<typename T = int>
- 类型
T
必须支持模板中的各种操作
- 模板在程序编译期间被实例化,
T
的值必须是编译期常量表达式
- 模板不会产生代码,只有在调用模板时才会产生特定类型的代码
- 模板参数可以有默认值
函数模板
template<typename T>
const T& max(const T& a, const T& b)
{
return a > b ? a : b;
}
int main()
{
max(12,34);
max<double>(12.34,56);
max<A>(A(),A());
return 0;
}
- 类型
T
必须支持函数模板里的各种操作,比如上面这个max
函数模板,类型T必须支持>
比较运算符。
- 函数模板本身不会产生代码,只有调用函数模板时,才会在
编译期间
生成一个特定的函数。
- 如果不调用函数模板,就不会产生任何代码。
template<typename T,int Q>
const T& max(const T& a, const T& b)
{
return a > b ? a : b;
}
int main()
{
max<int,5>(12,34);
int a = 5;
max<double,a>(12.34,56);
return 0;
}
- 普通类型也可以作为模板参数,例如
int
,const int
- 类类型和浮点类型不能作为模板参数
类模板
- 必须显式指定模板类型参数,编译器推断不出来
- 类模板的函数声明和实现必须放在同一个头文件中
- 类模板的成员函数(包括普通函数)只有为程序所用才进行实例化。如果某函数从未使用,则不会实例化该成员函数
- 类模板参数也可以是普通类型
template<typename T>
class Myclass
{
public:
Myclass();
~Myclass()
{
}
Myclass<T>& operator=(const Myclass& myclass);
Myclass& operator=(const Myclass& myclass);
};
template<typename T>
Myclass<T>::Myclass()
{
}
template <typename T>
Myclass<T>& Myclass<T>::operator