C++关于模板
2016-04-14 20:38
344 查看
假设现在要实现一个比较两个数是否相等的重载函数。1、两个int类型的操作数比较bool IsEqual (int left, int right){return left == right;}2、两个string类型的操作数比较bool IsEqual (const string& left , const string& right){return left == right;}void test1 (){string s1 ("s1"), s2("s2");cout<<IsEqual (s1, s2)<<endl;cout<<IsEqual (1,1)<<endl;}...如果还要比较int/char等等类型就都要分别实现一下,相似的代码重复度非常高。所以我们就要用到模板这一概念。概念模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。模板分为模板函数和模板类。模板函数函数模板格式: template <class 形参名1, class 形参名2, class 形参名n>返回类型 函数名(参数列表) {...}模板形参的定义既可以使用class,也可以使用typename,含义是相同的。模板函数登场,定义一个就搞定了。template<typename T>bool IsEqual(const T& left, const T& right){return left == right;}void test1(){string s1("s1" ), s2("s2");cout << IsEqual(s1, s2) << endl; //此处会将上面的T类型替换为string类型cout << IsEqual(1, 1) << endl; //此处会将上面的T类型替换为int类型}模板参数匹配及显示实例化template <typename T>bool IsEqual (const T& left , const T& right ){return left == right;}void test1 (){cout<<IsEqual (1,1)<<endl;//cout<<IsEqual(1,1.2)<<endl; // 模板参数不匹配cout<<IsEqual<int>(1,1.2)<< endl; // 显示实例化cout<<IsEqual<double>(1,1.2)<< endl; // 显示实例化}重载函数模板bool IsEqual (const int& left , const int& right){return left == right;}template <typename T>bool IsEqual (const T& left , const T& right ){return left == right;}template <typename T1, typename T2>bool IsEqual (const T1& left , const T2& right){return left == right;}void test1 (){cout<<IsEqual(1,1)<<endl;cout<<IsEqual<int>(1,1)<< endl;cout<<IsEqual(1,1.2)<<endl;}模板类普通类顺序表的定义typedef int DataType;//typedef char DataType;class SeqList{private :DataType* _data ;int _size ;int _capacity ;};template<typename T>class SeqList{private :T* _data ;int _size ;int _capacity ;};类模板的格式template<class 形参名1, class 形参名2, ...class 形参名n>class 类名{ ... };模板类// 动态顺序表template<typename T>class SeqList{public :SeqList();~ SeqList();private :int _size ;int _capacity ;T* _data ;};template <typename T>SeqList <T>:: SeqList(): _size(0), _capacity(10), _data(new T[ _capacity]){}template <typename T>SeqList <T>::~ SeqList(){delete [] _data ;}void test1 (){SeqList<int > sl1;SeqList<double > sl2;}模板总结优点:模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。增强了代码的灵活性。缺点:模板让代码变得凌乱复杂,不易维护,编译代码时间变长。出现模板编译错误时,错误信息非常凌乱,不易定位错误。模板还有一些高深晦涩的玩法,在实际运中的大多数的场景下上面的特性已经够我们玩了,所以不用去纠结模板的复杂莫测的玩法。真有兴趣深入学习的童鞋,或者有要用到一些复杂特性时,可以通过《C++ Templates 中文版》学习。
相关文章推荐
- 设计模式之行为型模式 - 调用行为的传递问题
- [div+css]晒晒最新制作专题推广页模板
- 2008大学生入党申请书 模板
- IMAIL多语言模板两套Outlook&Gmail模板下载
- 在PHP中使用模板的方法
- 深入解析php模板技术原理【一】
- Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
- 在ASP中不用模板生成HTML静态页直接生成.html页面
- 基于HTML模板和JSON数据的JavaScript交互(移动端)
- C#模板方法模式(Template Method Pattern)实例教程
- javascript文本模板用法实例
- 关于Asp代码与页面的分离模板技术第1/3页
- php模板原理讲解
- 需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
- DataGrid 动态添加模板列 实现代码
- 详解java模板和回调机制
- C++模板之特化与偏特化详解
- vs.net2008添加模板方法
- ThinkPHP模板判断输出Empty标签用法详解
- ThinkPHP模板范围判断输出In标签与Range标签用法详解