- C++模板简介
- 泛型编程
- 容器
- 一些进阶问题
1.C++模板简介
1. C++模板概观
一个简单的例子:取两个数中较大值的函数Max
不得不针对不同的型别提供每一种型别的重载
int Max(int a,int b)
{
return(a>b)?a:b;
}
long Max(long a,long b)
{
return(a>b)?a:b;
}
char Max(char a,char b)
{
return(a>b)?a:b;
}
如果使用模板:
则可以省去一堆冗余代码,从而将函数原型缩减到非常简洁的表达
template<typename T>T Max(T a,T b)
{
return(a>b)?a:b;
}
2.实例化
- 显式实例化为上面的Max函数例子
2.C++函数模板
1.定义
template <typename T>
inline T Max(const T& a,const T& b)
{
return(a>b)?a:b;
}
- 没有实例化之前,检查模板代码本身是否有语法错误
- 实例化期间,检查对模板代码的调用是否合法
- std::complex没有比较大小的功能‘>’
- 不允许自动型别的转化
Max(1,2.0) error
两种解决办法
- Max(static_cast(1),2.0)
- Max(1,2.0)
2.模板函数的使用
3.C++类模板
模板定义以关键字template开始,后接模板形参表
与调用函数模板形成对比,使用类模板时,必须为模板形参显式指定实参
每个模板类型形参前面必须带上关键字class或typename
《C++ primer》
一个类模板的例子:Stack
const std::size_t DefaultStackSize = 1024;
template<typename T,std::size_t n = DefaultStackSize> class Stack{
pulic:
void Push(const T const& element);
int Pop(T& element);
int Top(T& element);
private:
std::vector<T> m_Members;
std::size_t m_nMaxSize = n;
}
- 模板实参也可以是一个int或enum型别的常量(此处是size_t,本质是int型别)
- 除了copy constructor,如果在类模板中需要使用到这个类本身,应该使用其完整的定义
Push函数定义:
要定义一个类模板的成员函数,则要指明其是一个模板函数
template <typename T,std::size_t nMaxSize>
void Stack<T,nMaxSize>::Push(const T const& element)
{
if(m_Members.size()>= m_nMaxSize){
//error handing...
return;
}
m_Members.push_back(element);
}
4.操作符重载
版权声明:本文为博主原创文章,未经博主允许不得转载。