C++模板&泛型编程

---恢复内容开始---

一、泛型编程

定义:编写与类型无关的逻辑代码,是代码复用的一种手段。模板是泛型编程的基础

模板分为:函数模板和类模板

函数模板:代表了一个函数家族,该函数与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

函数模板的格式:template<typename p1,typename p2,...,typename p>   //typename和class都可以定义模板参数一般建议使用typelate好理解和类关键字区分

返回值类型  函数名(参数列表)

{...}

模板是蓝图,本身不是类或者函数,编译器用模板产生特定的类或者函数的特定类型版本,产生模板特定类型的过程成为模板的实类化

 定义模板关键字:T是模板参数名字可以任意命名,下面代码返回值是T类型这个很重要 1 template<typename T>
 2 T Add(T left,T right)
 3 {
 4     return left+right;
 5 }
 6
 7 int main()
 8 {
 9     cout<<Add(1,2)<<endl;;
10     return 0;
11 }//给main()函数里加一句cout<<Add(1.2,2.3)<<endl;函数模板将被编译两次// 1.实类化之前,检查模板代码本身,查看是否出现语法错误,如:遗漏分号。2.在实类化期间,检查模板代码,查看是否所有的调用都有效,如:实类化理性不支持某些函数调用 
这个返回值是T1,配合下面代码就是int ,函数返回值类型很重要,所以这里还是认真点 1 template<typename T1,typename T2>
 2 T1 Add(T1 left,T2 right)
 3 {
 4     return left+right;
 5 }
 6
 7 int main()
 8 {
 9     cout<<Add(1,‘2‘)<<endl;;
10     return 0;
11 }

模板函数也可以定义为inline函数

 1 template<typename T1,typename T2>
 2 inline T2 Add(T1 left,T2 right)
 3 {
 4     return left+right;
 5 }
 6
 7 int main()
 8 {
 9     cout<<Add(1,‘2‘)<<endl;;
10     return 0;
11 }
12 //返回值是字符3

模板参数:

模板函数有两种类型形参:模板参数和调用参数

模板形参分为:类型形参和非类型形参

//模板形参名字只能在模板形参之后到模板声明或定义的末尾之间使用,遵循名字屏蔽规则 1 typedef int T;
 2 template<typename T>
 3 void FunTest(T t)
 4 {
 5     cout<<"t type = "<<typeid(t).name()<<endl;
 6 }
 7 T gloab;
 8 int main()
 9 {
10     FunTest(10);
11     cout<<"gloab type = "<<typeid(gloab).name()<<endl;
12     return 0;
13 }

eg:判断下面函数定义是否有问题

 1 //template<class T,U,typename V>
 2 //void F1(T,U,V);
 3 //模板参数不能这样定义,模板参数前必须加上定义模板参数关键字class或者typeame
 4 //template<class T>
 5 //T F2(int &T);
 6
 7 //template<class T>
 8 //T F3(T,T);
 9 //typedef int TYPENAME;
10 //template<typename TYPENAME>
11 //TYPENAME F4(TYPENAME);

模板函数重载:

 主要看看下列情况调用哪个函数 1 int Max(const int& left,const int& right)//1
 2 {
 3     return (left>right)?left:right;
 4 }
 5 template<typename T>                     //2
 6 T Max(const T& left,const T&right)
 7 {
 8     return (left>right)?left:right;
 9 }
10 template<typename T>                     //3
11 T Max(const T& a,const T& b,const T& c)
12 {
13     return Max(Max(a,b),c);
14 }
15 int main()
16 {
17     Max(10,20,30);//3
18     Max<>(10,20);//2
19     Max(10,20); //1
20     Max(10,20.0);//1
21     Max<int>(10.0,20.0);//2
22     Max(10.0,20.0);//2
23     return 0;
24 }//注意:函数的所有重载版本的是声明都应该位于该函数被调用位置之前

二、模板函数特化

在某些情况下,通用模板定义对于某个类型可能是完全错误的,或者不能编译,或者做一些错误的事情

 1 template<class T>
 2 int compare(T t1,T t2)
 3 {
 4     if(t1>t2)
 5         return 1;
 6     else if(t1<t2)
 7         return -1;
 8     else
 9         return 0;
10 }
11 int main()
12 {
13     char *pStr1="holle";
14     char *pStr2="world";
15     cout<<compare(pStr1,pStr2)<<endl;
16     return 0;
17 }//结果是1,实际是-1

模板函数特化形式:

1、关键字template后面跟一个空的<>

2、再接模板名和<模板形参>

3、函数形参表

4、函数体

三、模板类

模板类型格式

template<typename p1,typename p2,...,typename p>

class 类名

{...}

eg:1 template<typename T>
2 class SeqList
3 {
4 private:
5     T* _Data;
6     int _size;
7     int _capacity
8 }
 1 //以模板方式实现动态顺序表
 2
 3 template<typename T>
 4 class SeqList
 5 {
 6 public:
 7     SeqList();
 8     ~SeqList();
 9 private:
10     int _size;
11     int _capacity;
12     T* _Data;
13 };
14 template<typename T>
15 SeqList<T>::SeqList()
16 :_size(0)
17 ,_capacity(10)
18 ,_Data(new T[_capacity])
19 {}
20 template<typename T>
21 SeqList<T>::~SeqList()
22 {
23     delete []_Data;
24 }
25 void FunTest()
26 {
27     //SeqList Seq;
28     SeqList<int>s1;
29     SeqList<double>s2;
30 }//有一种不同的类型编译器就会实类化出对应的一个类

---恢复内容结束---

时间: 2024-10-18 13:33:14

C++模板&泛型编程的相关文章

c++模板 与 泛型编程基础

C++模板 泛型编程就是以独立于任何特定类型的方式编写代码,而模板是泛型编程的基础. (1)定义函数模板(function template) 函数模板是一个独立于类型的函数,可以产生函数的特定类型版本. // implement strcmp-like generic compare function template <typename T> int compare(const T &v1, const T &v2) { if (v1 < v2) return -1;

论C++与三国

Scott Meyers曾说过,C++语言是一个语言联邦.C++包括面向过程,面向对象,泛型编程编程思想.如今C++11有加了一堆新特性,语言联邦更为庞大. 程序猿们,经常挑起语言之争,甚至连大师级人物都不能避免.Linux之父就曾经炮轰过C++.不过大多数语言都只能跟C++某一部分比,不是吗? 固然其他语言有些特性比C++优秀,甚至优秀很多,但是只有C++才是语言联邦!设计C++目的就是你需要啥就给你啥,如果你不需要大可不用,实用主义哲学. 我听说有人写了多年面向对象C++程序,没怎么接触模板

Linux C++学习之路(转自网络)

Module01 - Linux系统基础 由于本系列课程基于Linux(或UNIX),熟悉Linux操作系统是必要的前提. 该模块的课程包含以下方面的内容: 常用Unix/Linux命令    熟悉文件管理.文本处理.进程管理.网络.系统管理等各个方面大约100个常用的命令.    深入了解bash    了解Linux默认shell: bash 的语法.命令执行.I/O重定向.任务控制等.    正则表达式基础    由于UNIX/Linux中很多强大的文本处理命令如:grep.awk.sed

C/C++之路

以前是没有学C,直接学的C++,觉得也没什么.后来渐渐觉得,要想成为高手,学C是必须的. 按 Effective C++中的说法,C++分为四个部分: 1. C 2. 类和继承等面向对象 3. 模板泛型编程 4. STL 按照这个来,我觉得C++程序员需要看的一些书籍: C程序设计语言,C FAQs,C和指针,C专家编程: C++ Primer,C++程序设计语言,Effective C++,More Effective C++,深度探索C++对象模型: C++ Templates,C++设计新

C++:C++11新特性超详细版(1)

前言: 虽然目前没有编译器能够完全实现C++11,但这并不意味着我们不需要了解,学习它.深入学习C++11,你会发现这根本就是一门新的语言,它解决了c++98中许多遗留下来的问题.早晚会有一天,C++11便会普及大部分编译器.因此,提早做些准备也是应该的. 在此我想做一个关于C++11的专题,将C++11的新特性进行一一讲解,以通俗易懂的语言及例子帮助读者入门C++11.本文便是C++11新特性超详细版系列文章的第一篇, 即C++:[C++11]新特性超详细版(1). 不过我要强调的是,这些文章

基础c++体系结构图解

学习c++也有一段时间了,一直想要做一个类似知识体系的东西便于学习c++这门语言.     首先,分享一下我自己用思维导图(MindManager)画的简单的c++的体系,当然不会涉及知识的详谈只是一个框架之类的东西.     个人的一点想法:        1.类和对象是后面知识的一个支撑,是c++的一个精髓的部分,后面的知识点都是在类和对象的基础上展开的,所以务必认真,学的扎实.       2.内存管理又是c++区别于c语言的地方,因为构造函数和析构函数的原因.个人推荐使用库中的strin

linux 网络编程需要学习的内容

Linux C++培训发 课程模块 Linux C++全科班课程由以下模块组成: Module01 - Linux系统基础 由于本系列课程基于Linux(或UNIX),熟悉Linux操作系统是必要的前提. 该模块的课程包含以下方面的内容: 常用Unix/Linux命令熟悉文件管理.文本处理.进程管理.网络.系统管理等各个方面大约100个常用的命令. 深入了解bash了解Linux默认shell: bash 的语法.命令执行.I/O重定向.任务控制等. 正则表达式基础由于UNIX/Linux中很多

《C++ Primer Plus》学习笔记 第1章 预备知识

第一章 预备知识C++在C语言的基础上添加了对"面向对象编程"的支持和对"泛型编程"的支持.类 —— 面向对象模板 —— 泛型编程1.1 C++简介1.2 C++简史1.3 可移植性和标准1.4 程序创建的技巧http://www.cnblogs.com/moonlightpoet/p/5611668.html1.5 总结

C++11--20分钟了解C++11 (下)

20分钟了解C++11 9 override关键字 (虚函数使用) * * 避免在派生类中意外地生成新函数 */ // C++ 03 class Dog { virtual void A(int); virtual void B() const; } class Yellowdog : public Dog { virtual void A(float); // 生成一个新函数 virtual void B(); //生成一个新函数 } // C++ 11 class Dog { virtual