模板一般分函数模板与类模板
函数模板:
解决,不同数据进行同种操作时,可以给数据定义一个模板类型,以达到函数的通用性
基本语法
//模版函数定义
template <typename T> //定义模版类型名T
T test(T x){
return x;
}
test<int>();指定以int型替换T,不指定则系统会参数值自动判断;
计算绝对值函数:
#includeusing namespace std;template T abs(T temp){ temp = temp > 0 ? temp : -temp; return temp;}int main(){ int i = 10; double d = -5.5; cout << abs (i) << " " << abs (d) << endl; return 0;}
通过函数模板,计算数值的绝对值,就不用重复为不同类型数据定义函数;
类模板
解决同一种类,定义不过数据,或,其成员函数对不同数据作相同处理;
类模板基本语法:
template <class T>
class abs
{
private:
int i;
T x;
public:
abs(T a, T b){}
}
类模板对象的创建:
abs <int> a;
abs <double> b;
使用例:
#includeusing namespace std;template class Tes{ private: T i; T j; public: Tes(T x = 0, T y = 0) { i = x; j = y; } T put() { return i * j; } ~Tes() {}};int main(){ Tes a(2, 5); cout << a.put() < b(2.5, 5.5); cout << b.put() <
成员函数外部定义方法:
基本形式:
template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体},
template<class T> void Tes<T>::add(参数列表){函数体},
#includeusing namespace std;//定义模板类template class Tes{ private: T i; T j; public: Tes(T x = 0, T y = 0) { i = x; j = y; } T put() { return i * j; } T add(); ~Tes() {}};//外部定义函数方法template T Tes ::add(){ return i + j;}//主函数int main(){ Tes a(2, 5); cout << a.put() < b(2.5, 5.5); cout << b.put() <
总结:
在类模板中,只要使用到类名的,后面就要有<>的存在;
结构体模板:(等效于类模板)
template <class T>
struct name
{
T data;
name * next;
}
//初始化一个结点
name<int> a;
最后模板的使用体现形式;
//函数模板---使用体现:调用函数时传递的参数类型。template<返回类型> <函数名> (参数表){ 函数体}//结构体模板---使用体现:声明结构元素时 StackNode <类型> s;template struct StackNode{ struct T data; struct StackNode 类型> 函数名> 返回类型>*next;};//类模板---使用体现:声明类对象时 Stack <类型> s;template class Stack{ public: T pop(); bool push(T e); private: StackNode 类型>*p;}template //类模板外的 成员函数实现T Stack ::pop(){...}
更高阶应用