C++模板
2016-05-22 11:43
288 查看
关于模板,网上这篇写的比较详细:
http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html
我这里仅简要写一下用法,方便快速学习。
这个时候你就需要模板了,实际上STL标准库就是基于模板实现的。
我想起了我刚入行时的Unity3d笔试题,连续几题考类的重载,没有模板的概念我直接懵逼了……
其中class和typename效果完全相同,并且类型数量没有限制。
测试:
输出:
t1:1
t2:func
其中t3就是非类型形参,经过测试,非类型形参只有整形,字符型,指针和引用可以正常使用。
测试:
输出:
t1:1
t2:func
t3:3
注意例子中的构造函数,在类外定义的时候需要将模板参数列表带上。
在实例化模板类的时候,需要在模板类后面用尖括号指明每个模板参数的类型:
测试:
输出:
temp:1
注意类外定义的函数的模板参数列表一定要和类定义保持一致,使用的时候也要保持一致:
测试:
输出:
temp:1
maxID:10
转载请注明出处:http://blog.csdn.net/ylbs110/article/details/51474355
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;
}
相关文章推荐
- c++ 默认构造函数
- VS2013自动添加C++注释
- C++基础知识(一)—— C++程序结构
- 第六次C++上机实验
- c++第6次作业
- C++第六次上机作业—2、3题
- C++第六次上机实验—输出星号图
- C++第13周项目 多态性 【项目4-立体类族共有的抽象类】
- C++第13周项目 多态性 【项目3-形状类族的中的纯虚函数】
- C++第13周项目多态性 【项目2-动物这样叫】
- C++ 第十三周 多态性 项目1【项目1-分数类中的运算符重载】
- FCM压缩算法
- c++第6次作业
- c++中的string常用函数用法总结
- C语言实现五子棋简单功能
- c++第6次作业
- 深入理解C++中public、protected及private用法
- c程序在虚拟内存中的地址顺序
- L1-015. 跟奥巴马一起画方块(C++)
- C++类作业