C++模板Template
通常有两种:函数模板、类模板
一、函数模板:针对仅参数类型不同的函数
函数模板格式:
template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表)
{
函数体
}
一般形式如下示例所示:
template <class T>
void swap(T& a, T& b){}
二、类模板:针对仅数据类型和成员函数类型不同的类
template<class 形参名,class 形参名,…> class 类名
{ ... };
形式示例如下:
template<class T> class A
{
public:
T a;
T b;
T hy(T c, T &d);
};
template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体},
比如有两个模板形参T1,T2的类A中含有一个void h()函数,则定义该函数的语法为:
template<class T1,class T2> void A<T1,T2>::h(){}
当在类外面定义类的成员时template后面的模板形参应与要定义的类的模板形参一致。
注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。
三、模板的形参:类型形参,非类型形参、模板形参1.类型形参:由关键字class或typename后接说明符构成。
如:
template<class T> void h(T a){}
其中T就是一个类型形参。
用法注意:
针对函数模板,不能为同一个模板类型形参指定两种不同的类型,例如:
template<class T>void h(T a, T b){} //语句调用h(2, 3.2)将出错
针对类模板,当我们声明类对象为:
A<int> a,比如template<class T>T g(T a, T b){} //语句调用a.g(2, 3.2)在编译时不会出错,但会有警告
示例:
//TemplateDemo.h
#ifndef _TEMPLATE_DEMO_H_
#define _TEMPLATE_DEMO_H_
template<class T> class A{
public:
T g(T a,T b);
A();
};
#endif
//TemplateDemo.cpp
#include<iostream>
#include <string>
#include "TemplateDemo.h"
template<class T> A<T>::A(){
}
//template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体}
template<class T> T A<T>::g(T a,T b){
return a+b;
}
void main(){
A<int> a;
std::cout<<a.g(2,3.2)<<std::endl;
}
2.非类型形参
由于涉及到的知识点比较多,详细说明可以参考如下作者链接,感谢原创者知识分享与总结
http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html
http://www.cnblogs.com/gw811/archive/2012/10/25/2736224.html