C++模板

来源:互联网 发布:医院药房软件系统 编辑:程序博客网 时间:2024/06/15 09:51

关于模板,网上这篇写的比较详细:
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;}
1 0
原创粉丝点击