泛型编程就是以独立于任何特定类型的方式编写代码,而模板是C++泛型编程的基础.

所谓template,是针对“一个或多个尚未明确的类型”所编写的函数或类.

使用template时,可以显示的或隐示的将类型当作参数来传递.

下面是一个典型的例子,传回两数中的较大者:

template<class T>
inline const T& MAX(const T& a,const T& b)
{
return a>b?a:b;
}

在这里,第一行将T定义为任意数据类型,于函数被调用时由调用者指定.

这个类型有关键字class引导,也可用typename引导,typename其实比class更直观.

(需要注意的是,如果用到了嵌套依赖类型,则必须要用到typename).

理解:

  第一行template<class T>告诉编译器:我在这儿定义了一个可变类型T,调用者使用什么类型你就怎么编译吧!

缺省模板参数

template class可以有缺省参数,例如一下声明,允许你使用一个或多个template来声明MyClass对象:

template<class T,class container=vector<T> >
class MyClass
{
public:
MyClass(){}
~MyClass(){}
protected:
private:
};

如果只传递一个参数,那么缺省参数可作为第二参数使用:

MyClass<int> x1; // equivalent to:
MyClass<int,vector<int> > x2;

注意:template缺省参数根据前一个(或前一些)参数而定义。这也就意味着如果参数传递列表中某个参数是缺省参数,那么后面的所有参数都应该是缺省参数.

关键字typename

关键字typename被用来做为类型之前的标识符号。考虑下面例子:

template<class SubType>
struct BaseType
{
SubType a;
}; template <class T>
class MyClass1
{
typename T::SubType *ptr;
// ...
};

这里,typename指出SubType是class T中定义的一个类型,因此ptr是一个指向T::SubType的指针.

如果没有typename,SubType将会被当成一个static成员,于是:

T::SubType * ptr;

会被解释为类型T中的两个子成员SubType和ptr的乘积.

成员模板

class成员函数可以是个template,但是这样的成员template类型既不能是virtual,也不能有缺省参数,例如:

class MyClass
{
//...
template<class T>
void f(T);
};

在这里,MyClass::f声明了一个成员函数,适用于任何类型参数.

这个特性常用来为template class中的成员提供自动类型转换,例如下面的例子中,assign()的参数x,其类型必须和调用端所提供的对象的类型完全吻合:

template<class T>
class MyClass
{
public:
MyClass();
~MyClass();
void assign(const MyClass<T>& x) // x must have same type as *this
{
value=x.value;
}
// ...
protected:
private:
T value;
};

如果使用了两个类型,即使两个类型之间可以自动转换,也会出错:

void fun()
{
MyClass<double> d;
MyClass<int> i; d.assign(d); // OK
d.assign(i); // ERROR: i is MyClass<int> but MyClass<double> is required
}

理解:

  对于一个template class中的template成员,遵循“先入为主”,如果第一次指定了类型,那么后面都要和第一次保持一致.

但如果要指定两个不同类型的类成员变量怎么办呢?

方法很简单,我们将成员变量在使用一个和class不同的template类型就行:

template<class T>
class MyClass
{
public:
MyClass();
~MyClass();
template<class X> // member template
void assign(const MyClass<X>& x) // allow different template types
{
value = x.getValu();
}
T getValue() const
{
return value;
}
// ...
protected:
private:
T value;
}; void fun()
{
MyClass<double> d;
MyClass<int> i; d.assign(d); // OK
i.assign(i); // OK (int is assigned to double)
}

C++泛型编程:template模板的更多相关文章

  1. C++ template模板编程

    模板是C++泛型编程的基础,一个模板就是一个创建类或者函数的蓝图或者公式.当使用一个vector这样的泛型类型,我们提供足够的信息,就可以将蓝图转换成特定的类或者函数. 假设我们编写一个函数来比较两个 ...

  2. angularjs指令系统系列课程(2):优先级priority,模板template,模板页templateUrl

    今天我们先对 priority,template,templateUrl进行学习 1.priority 可取值:int 作用:优先级 一般priority默认为0,数值越大,优先级越高.当一个dom元 ...

  3. ArcGIS API for Silverlight代码中使用Template模板

    原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffS ...

  4. Git commit template 模板设定

    多人协作开发一个项目时,版本控制工具是少不了的,git是linux 内核开发时引入的一个优秀代码管理工具,利用它能很好使团队协作完成一个项目.为了规范团队的代码提交,也方便出版本时的release n ...

  5. 一个简单地template模板

    之前的项目中用到了artTemplate模板,感觉挺有意思,于是查看相关资料,自己动手写了个简单地template模板插件.虽然会有一些不足,但也是自己的一番心血.主体代码如下 /* * 一个简单地t ...

  6. 小程序开发--template模板

    小程序的template模板可以说是我遇到的最简单的了,看看实例: <template name="article"> <view class='containe ...

  7. Vue 组件&组件之间的通信 之 template模板引用与动态组件的使用

    template模板引用 在component的template中书写大量的HTML元素很麻烦. Vue提供了<template>标签,可以在里边书写HTML,然后通过ID指定到组建内的t ...

  8. 微信小程序template模板与component组件的区别和使用

    前言: 除了component,微信小程序中还有另一种组件化你的方式template模板,这两者之间的区别是,template主要是展示,方法则需要在调用的页面中定义.而component组件则有自己 ...

  9. 微信小程序新闻列表功能(读取文件、template模板使用)

    微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...

  10. spring框架学习(六)AOP事务及spring管理事务方式之Template模板

    概念 1.事务 1)事务特性:ACID 原子性 :强调事务的不可分割. 一致性 :事务的执行的前后数据的完整性保持一致. 隔离性 :一个事务执行的过程中,不应该受到其他事务的干扰. 持久性 :事务一旦 ...

随机推荐

  1. 算法与数据结构(十七) 基数排序(Swift 3.0版)

    前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...

  2. 从netty-example分析Netty组件续

    上文我们从netty-example的Discard服务器端示例分析了netty的组件,今天我们从另一个简单的示例Echo客户端分析一下上个示例中没有出现的netty组件. 1. 服务端的连接处理,读 ...

  3. 以向VS 程序打包集成自动写入注册表功能为例,介绍如何实现自由控制安装过程

    最近由于项目部署时需要更灵活的控制程序安装的流程以及自定义安装行为,特意研究了一下VS程序打包,把解决办法和大家分享一下. 以VS2010为例: 这是一个已经设置好最基本的Visual Studio ...

  4. 分享两种实现Winform程序的多语言支持的解决方案

    因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同.经过我与几个同事的多番沟通,确定了以下两种方案: 方案一:在窗体基类中每次加载并 ...

  5. 微信小程序初探

    做为码农相信大家最近肯定都会听到微信小程序,虽然现阶段还没有正式开放注册,但大家可以还是可以开发测试. 到微信的WIKI(http://mp.weixin.qq.com/wiki?t=resource ...

  6. stringstream的基本用法

    原帖地址:https://zhidao.baidu.com/question/580048330.htmlstringstream是字符串流.它将流与存储在内存中的string对象绑定起来.在多种数据 ...

  7. Android之解析XML

    1.XML:可扩展标记语言. 可扩展标记语言是一种很像超文本标记语言的标记语言. 它的设计宗旨是传输数据,而不是显示数据. 它的标记没有被预定义.需要自行定义标签. 它被设计为具有自我描述性. 是W3 ...

  8. [故障公告]受阿里云部分ECS服务器故障影响,目前无法上传图片与文件

    抱歉!今天下午阿里云华东1可用区B的部分ECS服务器出现IO HANG问题,受此影响,我们的图片与文件上传服务器无法访问,由此给您带来麻烦,请您谅解. 16:30左右开始,我们发现图片与文件上传服务器 ...

  9. .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono

    .NET Core 超强性能测试组件BenchmarkDotNet 支持Full .NET Framework, .NET Core (RTM), Mono. BenchmarkDotNet支持 C# ...

  10. 集成基于CAS协议的单点登陆

    相信大家对单点登陆(SSO,Single Sign On)这个名词并不感到陌生吧?简单地说,单点登陆允许多个应用使用同一个登陆服务.一旦一个用户登陆了一个支持单点登陆的应用,那么在进入其它使用同一单点 ...