关于模板,网上这篇写的比较详细:
http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html
我这里仅简要写一下用法,方便快速学习。
需求
我们可以通过函数的重载以及指向函数的指针来实现函数的多态,C#里面还可以使用委托和事件来更方便的达到这个效果。但是毕竟重载太麻烦,相同的逻辑要写多次;指针无法解决参数类型的问题;如果你要封装一个类,他会在多个地方调用,但是某些成员变量的类型需要根据实际情况来获得怎么办?
这个时候你就需要模板了,实际上STL标准库就是基于模板实现的。
我想起了我刚入行时的Unity3d笔试题,连续几题考类的重载,没有模板的概念我直接懵逼了……
用法
函数模板
类型形参
类型形参是将模板作为类型来使用的形参,由关键字class或typename后接说明符构成:
template<class T1, typename T2>
void templateFunction(T1 t1,T2 t2){
cout << "t1:" << t1 << endl;
cout << "t2:" << t2 << endl;
}
其中class和typename效果完全相同,并且类型数量没有限制。
测试:
templateFunction<int,string>(1,"func");
输出:
t1:1
t2:func
非类型形参
除了在模板中使用类型模板,还可以将已知类型的参数放在模板列表中,实际效果与函数参数相同:
template<class T1, typename T2, int t3>
void templateFunction(T1 t1,T2 t2){
cout << "t1:" << t1 << endl;
cout << "t2:" << t2 << endl;
cout << "t3:" << t3 << endl;
}
其中t3就是非类型形参,经过测试,非类型形参只有整形,字符型,指针和引用可以正常使用。
测试:
templateFunction<int,string,3>(1,"func");
输出:
t1:1
t2:func
t3:3
类型模板
类型形参
类型模板和函数模板类似,不过类型中每个函数在类外定义的时候都要带上模板参数列表:
template<typename T>
class templateClass
{
public:
templateClass(T t);
~templateClass();
void print(){
cout << "temp:" << temp << endl;
}
T temp;
private:
};
template<typename T>
templateClass<T>::templateClass(T t) :temp(t)
{
}
注意例子中的构造函数,在类外定义的时候需要将模板参数列表带上。
在实例化模板类的时候,需要在模板类后面用尖括号指明每个模板参数的类型:
测试:
templateClass<int> c(1);
c.print();
输出:
temp:1
非类型形参
与模板函数一样,类模板也可以定义非类型形参:
template<typename T,int max>
class templateClass
{
public:
templateClass(T t);
void print(){
cout << "temp:" << temp << endl;
cout << "maxID:" << maxID << endl;
}
private:
T temp;
int maxID=max;
};
template<typename T, int max>
templateClass<T,max>::templateClass(T t) :temp(t)
{
}
注意类外定义的函数的模板参数列表一定要和类定义保持一致,使用的时候也要保持一致:
测试:
templateClass<int,10> c(1);
c.print();
输出:
temp:1
maxID:10
转载请注明出处:http://blog.csdn.net/ylbs110/article/details/51474355
全部代码:
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
template<typename T,int max>
class templateClass
{
public:
templateClass(T t);
void print(){
cout << "temp:" << temp << endl;
cout << "maxID:" << maxID << endl;
}
private:
T temp;
int maxID=max;
};
template<typename T, int max>
templateClass<T,max>::templateClass(T t) :temp(t)
{
}
template<class T1, typename T2, int t3>
void templateFunction(T1 t1,T2 t2){
cout << "t1:" << t1 << endl;
cout << "t2:" << t2 << endl;
cout << "t3:" << t3 << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
templateFunction<int,string,3>(1,"func");
templateClass<int,10> c(1);
c.print();
return 0;
}