1、泛型编程

——即实现一个通用的标准容器库。

所谓通用的标准容器库,就是要做到:比方List类存放全部肯恩类型的对象这样的事;泛型编程让你编写一个全然一般化并可反复使用的算法,其效率与针对某特定数据类型而设计的算法同样。泛型即是指具有在多种数据类型上皆可操作的意思,与模板有些相似。

——泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。

2、如何编写一个通用的加法??

     1》使用函数重载,针对每一个所需同样行为的不同类型又一次实现它。

     缺点:1》仅仅要有新类型出现。就要又一次加入相应函数。

               2》除类型外,全部函数的函数体都同样,代码的复用率不高。

               3》假设函数仅仅是返回值类型不同,函数重载不能解决这个问题。

               4》一个方法有问题。全部的方法都有问题,不好维护。

     2》使用公共基类。将通用代码放在公共基类里面。

     缺点:1》借助公共基类来编写通用代码,将失去类型检查的长处。

               2》对于以后实现的非常多类,都必须继承自某个特定的基类,代码维护更加困难。

     3》使用特殊的预处理程序。

     缺点:1》不是函数,不进行參数类型检查。安全性不高。

     4》还能够使用泛型编程。

3、泛型编程:

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

     2》模板分为:函数模板、类模板

4、函数模板:

    1》函数模板代表了一个函数家族,在使用时被參数化,依据实參类型产生函数的特定类型。

    2》函数模板的格式:

     注意:1>typename是用来定义模板參数keyword,也能够使用class(建议尽量使用typename)

               2>可是不能使用struct

     3》函数模板也能够定义成inline函数。(可是inline必须放在模板參数表之后,返回值之前,不能放在template之前)

   4》模板是一个蓝图,它本身不是类或者函数,编译器用模板产生特定的类或者函数的特定类型版本号,产生模板特定类型的过程称为函数模板实例化。

5、实參推演:

     从函数实參确定模板形參类型和值的过程叫做模板实參推演。多个类型形參的实參必须全然匹配。

6、类型形參转换:

     1》一般不会转换实參来匹配已有的实例化,相反会产生新的实例。

     2》编译器仅仅会运行两种转换:

           1>const转换:接收const引用或者const指针的函数能够分别用非const对象的引用或者指针来调用

           2>数组或者函数到指针的转换:假设模板形參不是引用类型,则对数组或者函数类型的实參应该用常规指针转换。数组实參将当做指向其第一个元素的指针,函数实參当做指向函数类型的指针。

7、模板參数:

    1》函数模板有两种类型的參数:模板參数和调用參数。

    2》而模板參数又分为:类型形參和非类型形參

    3》模板形參名字仅仅能在模板形參之后到模板声明或定义的结尾之间使用。遵循名字屏蔽规则。

    4》模板形參的名字在同一模板形參列表中仅仅能使用一次。

    5》全部模板形參前面必须加上class或者typenamekeyword修饰。

    6》注意在函数模板内部不能指定缺省的模板实參。

8、非模板类型形參:

     非模板类型形參是在模板内部定义的常量。在须要常量表达式的时候。能够使用非模板类型參数。

9、模板形參说明:

     1》模板形參表使用<>括起来。

     2》和函数參数表一样。跟多个參数时必须用逗号隔开,类型能够同样也能够不同。

     3》模板形參表不能为空。

     4》模板形參能够是类型形參,也能够是非类型形參。类型形參跟在class和typename之后。

     5》模板类型形參可作为类型说明符用在模板中的不论什么地方,与内置类型或自己定义类型的用法全然同样。可用于指定函数形參类型、返回值、局部变量和强制类型转换。

     6》模板參数表中,class和typename具有形同的含义,能够互相交换。使用typename更加直观。可是keywordtypename是作为C++标准加入到C++中。就得编译器可能不支持。

9+、模板函数重载:

      注意:函数和全部的重载版本号的声明都应该位域该函数被调用位置之前。

      说明:

       1》一个非模板函数能够和一个同名的函数模板同一时候存在。并且该函数模板能够被实例化为这个非模板函数。

       2》对于非模板函数和同名函数模板。假设其它条件都同样,再调用时会优先调用非模板函数,而不会从该模板产生一个实例化。假设模板能够产生一个具有更好匹配的函数。那么将选择模板。

       3》显示指定一个空的模板实參列表。该语法告诉编译器仅仅有姆安巴你才干匹配这个调用。并且全部的模板都应该依据实參演绎出来。

       4》模板函数不同意自己主动类型转换,但普通函数能够进行自己主动类型转换。

10、函数模板的特化:

        模板函数特化形式例如以下:

        1》keywordtemplate后面接一对空的尖括号<>

        2》再接模板名和一对尖括号,尖括号里指定这个特化定义的模板形參

        3》函数形參表

        4》函数体

      注意:在特化之前。这个函数模板必须已经存在,并且两者形參个数一样。

template<typename T>
bool IsEqual(T left, T right)
{
return left == right;
}
template<>
bool IsEqual<const char*>( const char * pleft, const char * pright) //这里的<const char*>就相当于取代了T
{
return pleft == pright;
} 11、模板參数——适配器:stack(使用模板实现栈——后进先出)
template <typename T>
class SeqList
{
private :
int _size ;
int _capacity ;
T* _data ;
}; // template <class T, template<class> class Container>
template <class T, template<class> class Container = SeqList> // 缺省參数
class Stack
{
public :
void Push(const T& x );
void Pop();
const T& Top();
bool Empty();
private :
Container<T > _con;
};
void Test()
{
Stack<int> s1;
Stack<int , SeqList> s2;
}
模板的模板參数——实现队列
template<typename T,template< typename T > class Containter> //再嵌套一个模板类型參数,,这里的keyword一定是class————仅仅有类模板參数才干指定缺省值
class Queue
{
public:
Queue()
{}
void PushBack(const T& d)
{
_con.PushBack();
}
void PopFront()
{
_con.PopFront();
}
private:
Containter<T > _con;
}; int main()
{
Queue<int ,SeqList> q;
q.PushBack(1);
q.PushBack(2);
q.PopFront();
return 0;
}

 

12、非类型的模板參数:

// 静态顺序表

//template<typename T, size_t MAX_SIZE>
template <typename T, size_t MAX_SIZE = 10> //带缺省模板參数
class SeqList
{
public :
SeqList();
private :
T _array [MAX_SIZE];
int _size ;
}; template <typename T, size_t MAX_SIZE>
SeqList <T, MAX_SIZE>::SeqList()
: _size(0)
{}
void Test()
{
SeqList<int> s1;
SeqList<int , 20> s2;
}

13、模板类:

模板类也是模板。必须以keywordtemplate开头,后接模板形參表。


14、模板类的实例化:

       1》仅仅要有一种不同的类型。编译器就会实例化出一个相应的类。

       2》 SeqList<int > sl1 
 
SeqList<double > sl2;当定义上述两种类型的顺序表时,编译器会使用int和double分别取代模板形參。又一次编写SeqList类,最后创建名为SeqList<int>和SeqList<double>的类。

15、类模板的特化:分两种——局部特化、全特化

 注意:全特化后定义成员函数,不再须要模板形參   

      1》类型萃取

      2》POD类型萃取

16、模板的分离编译:

——解决方法:

       1》在模板头文件 xxx.h 里面显示实例化->模板类的定义后面加入 template class SeqList<int >; 一般不推荐这样的方法,一方面老编译器可能不支持。还有一方面实例化依赖调用者。(不推荐)

       2》将声明和定义放到一个文件 "xxx.hpp" 里面,推荐使用这样的方法。

17、模板总结:

    ——长处:

                1》模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。

                2》增强了代码的灵活性。

    ——缺点:

                1》模板让代码变得凌乱复杂。不易维护,编译代码时间变长。

                2》 出现模板编译错误时,错误信息非常凌乱,不易定位错误。

C++里的模板的更多相关文章

  1. poj 1061 青蛙的约会 拓展欧几里得模板

    // poj 1061 青蛙的约会 拓展欧几里得模板 // 注意进行exgcd时,保证a,b是正数,最后的答案如果是负数,要加上一个膜 #include <cstdio> #include ...

  2. ES6里关于模板字面量的拓展

    JS 的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串.字符串格式化.HTML转义等.ES6通过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系 ...

  3. AJAX里使用模板引擎

    一.概述: 处理响应数据渲染可以使用模板引擎(实际上就是一个API,目的是更容易的将数据渲染到HTML中) 目前市面上有许多模板引擎,可以参考 推荐使用artTemplate,它采用作用域预声明的技术 ...

  4. 类欧几里得模板 p5170

    //类欧几里得的模板题 p5170 //求这三个式子: //第一个跟后两个没关联 //后两个跟其余两个都有关联: #include<cstdio> #include<algorith ...

  5. poj 1061 青蛙的约会 (扩展欧几里得模板)

    青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status ...

  6. 扩展欧几里得模板&逆元求法

    拓展欧几里得: 当 gcd ( a , b )= d 时,求绝对值和最小的 x , y 使得 x * a + y * b = d : d = gcd ( a , b ) = gcd ( b , a m ...

  7. Uva12169 扩展欧几里得模板

    Uva12169(扩展欧几里得) 题意: 已知 $x_i=(a*x_{i-1}+b) mod 10001$,且告诉你 $x_1,x_3.........x_{2t-1}$, 让你求出其偶数列 解法: ...

  8. poj 2115 C Looooops(推公式+扩展欧几里得模板)

    Description A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...

  9. 在gridview里查找模板里的button控件

    这个问题,真是搞了我1天,这次记住他 第一种方法: protected void GridView1_RowCommand(object sender, GridViewCommandEventArg ...

随机推荐

  1. 里根上台时国债只占GDP的30%

    学里根是刻舟求剑,关键是钱从哪来 5  里根主要靠借钱,这是冷战红利,美国打完二战国债占了GDP的120%,然后总量就没怎么增加,但战后GDP快速增长,结果国债占GDP的比例连续下降,打越战登月石油危 ...

  2. Windows安装PHP MongoDB扩展

    本文将讲述一下在Wamp环境下安装MongoDB扩展的过程,大家可以略作参考 Linux 版本的可以参考之前发布的Linux安装PHP MongoDB扩展 安装环境 系统环境:Windows 7 64 ...

  3. Kali linux 2016.2(Rolling)里Metasploit连接(包括默认和自定义)的PostgreSQL数据库之后的切换到指定的工作空间

    不多说,直接上干货! 为什么要这么做? 答: 方便我们将扫描不同的目标或目标的不同段,进行归类.为了更好的后续工作! 前期博客 Kali linux 2016.2(Rolling)里Metasploi ...

  4. PostgreSQL源代码中插件的使用

    如果编译数据库时使用了gmake world和gmake install-world, 所有的插件都会被安装, 那么就不需要再次安装了. 插件目录 contrib 进入要安装的插件目录, 例如 cd ...

  5. <Sicily>Threecolor problem

    一.题目描述 有红黄蓝3种颜色的n个珠子,师傅希望悟空把它们排成红色珠子在左,黄色珠子居中,蓝色珠子在右的一行,然后告诉师傅,从左数起,第m个珠子是什么颜色.众所周知,悟空是只猴子,他没有这个耐心,你 ...

  6. 一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程

    今天小编给大家详细的讲解一下Scrapy爬虫框架,希望对大家的学习有帮助. 1.Scrapy爬虫框架 Scrapy是一个使用Python编程语言编写的爬虫框架,任何人都可以根据自己的需求进行修改,并且 ...

  7. NodeJS学习笔记 进阶 (1)Nodejs进阶:服务端字符编解码&乱码处理(ok)

    个人总结:这篇文章主要讲解了Nodejs处理服务器乱码及编码的知识,读完这篇文章需要10分钟. 摘选自网络 写在前面 在web服务端开发中,字符的编解码几乎每天都要打交道.编解码一旦处理不当,就会出现 ...

  8. POJ-1456 Supermarket 贪心问题 有时间限制的最小化惩罚问题

    题目链接:https://cn.vjudge.net/problem/POJ-1456 此题与HDU-1789完全是一道题 题意 有N件商品,分别给出商品的价值和销售的最后期限,只要在最后日期之前销售 ...

  9. 参考《深度学习之PyTorch实战计算机视觉》PDF

    计算机视觉.自然语言处理和语音识别是目前深度学习领域很热门的三大应用方向. 计算机视觉学习,推荐阅读<深度学习之PyTorch实战计算机视觉>.学到人工智能的基础概念及Python 编程技 ...

  10. Python 批处理文本文件、进行查找

    去年换了一部手机,老手机终于光荣退休了,但是里面的便签里还存有很多文字记录,这个手机还不能备份到云,只能将每个便签保留为一个个的文本文件,我想要把所有的文本文件归到一个文本文件中,手动操作太麻烦了,刚 ...