转自https://www.cnblogs.com/cynchanpin/p/7127897.html

1、在c++Template中非常多地方都用到了typename与class这两个关键字,并且好像能够替换,是不是这两个关键字全然一样呢?
答:class用于定义类,在模板引入c++后,最初定义模板的方法为:template,这里class关键字表明T是一个类型。后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字。它的作用同class一样表明后面的符号为一个类型。这样在定义模板的时候就能够使用以下的方式了: template.在模板定义语法中关键字class与typename的作用全然一样。

2.类模板与模板类的概念

(1) 什么是类模板
一个类模板(也称为类属类或类生成类)同意用户为类定义一种模式。使得类中的某些数据成员、默写成员函数的參数、某些成员函数的返回值,能够取随意类型(包含系统提前定义的和用户自己定义的)。
假设一个类中数据成员的数据类型不能确定。或者是某个成员函数的參数或返回值的类型不能确定。就必须将此类声明为模板,它的存在不是代表一个详细的、实际的类,而是代表着一类类。

(2)类模板定义
定义一个类模板,一般有双方面的内容:
A.首先要定义类,其格式为:

template <class T>
class foo
{
……
}

foo 为类名,在类定义体中,如採用通用数据类型的成员,函数參数的前面需加上T。当中通用类型T能够作为普通成员变量的类型,还能够作为const和static成员变量以及成员函数的參数和返回类型之用。

比如:

template<class T>
class Test{
private:
T n;
const T i;
static T cnt;
public:
Test():i(0){}
Test(T k);
~Test(){}
void print();
T operator+(T x);
};

B. 在类定义体外定义成员函数时,若此成员函数中有模板參数存在,则除了须要和一般类的体外定义成员函数一样的定义外,还需在函数体外进行模板声明
比如

template<class T>
void Test<T>::print(){
std::cout<<"n="<<n<<std::endl;
std::cout<<"i="<<i<<std::endl;
std::cout<<"cnt="<<cnt<<std::endl; }

假设函数是以通用类型为返回类型,则要在函数名前的类名后缀上“”。

比如:

template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}
template<class T>
T Test<T>::operator+(T x){
return n + x;
}

C. 在类定义体外初始化const成员和static成员变量的做法和普通类体外初始化const成员和static成员变量的做法基本上是一样的,唯一的差别是需再对模板进行声明,比如

template<class T>
int Test<T>::cnt=0;
template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}

(3) 类模板的使用 类模板的使用实际上是将类模板实例化成一个详细的类。它的格式为:类名<实际的类型>。
模板类是类模板实例化后的一个产物。说个形象点的样例吧。

我把类模板比作一个做饼干同的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时用的是什么材料了,你能够做巧克力饼干,也能够做豆沙饼干,这些饼干的除了材料不一样外,其它的东西都是一样的了。
3.函数模板和模板函数

(1)函数模板
函数模板能够用来创建一个通用的函数。以支持多种不同的形參。避免重载函数的函数体反复设计。

它的最大特点是把函数使用的数据类型作为參数。

函数模板的声明形式为:

template<typename(或class) T>
<返回类型><函数名>(參数表)
{
函数体
}

当中,template是定义模板函数的关键字;template后面的尖括号不能省略;typename(或class)是声明数据类型參数标识符的关键字。用以说明它后面的标识符是数据类型标识符。这样,在以后定义的这个函数中,凡希望依据实參数据类型来确定数据类型的变量,都能够用数据类型參数标识符来说明,从而使这个变量能够适应不同的数据类型。

比如:

template<typename(或class) T>
T fuc(T x, T y)
{
T x;
//……
}

函数模板仅仅是声明了一个函数的描写叙述即模板。不是一个能够直接运行的函数,仅仅有依据实际情况用实參的数据类型取代类型參数标识符之后,才干产生真正的函数。

(2)模板函数:
模板函数的生成就是将函数模板的类型形參实例化的过程。

比如:

 double d;
int a;
fuc(d,a);

则系统将用实參d的数据类型double去取代函数模板中的T生成函数:

double fuc(double x,int y)
{
double x;
//……
}

C++之 模板Template的使用的更多相关文章

  1. Magento的布局(Layout),块(Block)和模板(Template)

    public function indexAction() { //remove our previous echo //echo 'Hello Index!'; $this->loadLayo ...

  2. Silverlight 模板(Template)使用

    模板(Template)是控件另一种样式 它和样式(style)不同的是它允许已有的控件进行组合新的一个控件样式 那么先看一下最简单Template代码 xaml代码 <Button Conte ...

  3. Python - 定制pattern的string模板(template) 具体解释

    定制pattern的string模板(template) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/28625179 ...

  4. 微信小程序开发--模板(template)使用,数据加载,点击交互

    微信小程序视图层提供了 模板(template),可以在模板中定义代码片段,然后在不同的地方调用.结果在数据渲染那懵逼了.按照官网上对模板的说明和对数据的加载. 1.定义模板 使用name属性,作为模 ...

  5. C++类模板 template <class T>

    C++在发展的后期增加了模板(template )的功能,提供了解决这类问题的途径.可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数. 比如: class Compare_int class ...

  6. C++ - 模板(template)中typename的使用方法

    声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 从属名称(dependent ...

  7. 【template、import、include】微信小程序:模板(template)、引用(import、include)说明

    模板(template): 定义模板 <template name="[String]"> <!-- 模板代码 --> <view> <t ...

  8. elasticsearch模板 template

    https://elasticsearch.cn/article/335 elasticsearch模板 template 可以考虑的学习点: mapping的 _default_类型 动态模板:dy ...

  9. 小程序使用模板template

    小程序使用模板template 1.介绍:模板就是代码的高度复用,将在很多页面使用了相同的部分可以使用模板封装 <!-- 在页面组件中使用 --> <!-- 此时定义了一个模板 -- ...

  10. 设计模式C++模板(Template)模式

    设计模式C++描述----02.模板(Template)模式(转载) 一. 问题 在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现, ...

随机推荐

  1. Vue3.0项目快速搭建

    安装安装vue-cli npm install -g @vue/cli # 或者 yarn global add @vue/cli 创建项目 vue create hello-world 至此项目搭建 ...

  2. 04-spark streaming

    1.基本概念(了解) ①流(Streaming): 是一种数据传送技术,它把客户机收到的数据变成一个稳定连续的流,源源不断地送出,使用户听到的声音或看到的图象十分平稳, 而且用户在整个文件送完之前就可 ...

  3. Celery 在Windows下启动worker时出现错误:ValueError: not enough values to unpack (expected 3, got 0)

    在公司Linux环境下没有出现问题,在回到家后直接在Windows10下运行出现错误: ValueError: not enough values to unpack (expected 3, got ...

  4. OSB格式(REST)转化(XML到JSON,JSON到XML)

    OSB转换项目操作手册 新建一个OSB项目 建立以下文件夹,以便更规范的管理工程 一.XML转JSON 1.导入wsdl文件 1)右键wsdl文件夹,选择import选项 2)在弹出框中选择Servi ...

  5. sql zhuan ORACLE

    DbType   OracleType SqlDatabase OracleDatabase SqlParam.cs SqlServerHelper.cs InsertByHashtableRetur ...

  6. redis下操作Set和Zset

    redis操作set 无序集合 元素为string类型 元素具有唯一性,不重复 命令 设置 添加元素 SADD key member [member ...]  获取 返回key集合所有的元素 SME ...

  7. CentOS7上安装RabbitMQ

    1.首先需要安装erlang RabbitMq依赖于erlang,所以得先装这个.推荐使用阿里云的镜像资源. 通过这个链接 https://opsx.alibaba.com/mirror/search ...

  8. iOS oc 检测手机移动网络和wifi是否开启

    利用Reachability的的一个方法currentReachabilityStatus 获取枚举类型值判断是否为2即可,不是2就不是WiFi. enum {        // DDG Netwo ...

  9. 56.纯 CSS 描述程序员的生活

    原文地址:https://segmentfault.com/a/1190000015316996 感想:动画加延时,white-space: pre; 保留HTML p 中刻意留下的空白. HTML ...

  10. Linux系统Oracle启动、关闭

    Linux系统启动Oracle命令 su - oracle sqlplus /nolog conn / as sysdba startup exit lsnrctl start exit Linux系 ...