您的位置:首页 > 编程语言 > C语言/C++

C++模板

2016-05-22 11:43 288 查看
关于模板,网上这篇写的比较详细:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: