泛型编程就是以独立于任何特定类型的方式编写代码,而模板是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模板的更多相关文章
-
C++ template模板编程
模板是C++泛型编程的基础,一个模板就是一个创建类或者函数的蓝图或者公式.当使用一个vector这样的泛型类型,我们提供足够的信息,就可以将蓝图转换成特定的类或者函数. 假设我们编写一个函数来比较两个 ...
-
angularjs指令系统系列课程(2):优先级priority,模板template,模板页templateUrl
今天我们先对 priority,template,templateUrl进行学习 1.priority 可取值:int 作用:优先级 一般priority默认为0,数值越大,优先级越高.当一个dom元 ...
-
ArcGIS API for Silverlight代码中使用Template模板
原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffS ...
-
Git commit template 模板设定
多人协作开发一个项目时,版本控制工具是少不了的,git是linux 内核开发时引入的一个优秀代码管理工具,利用它能很好使团队协作完成一个项目.为了规范团队的代码提交,也方便出版本时的release n ...
-
一个简单地template模板
之前的项目中用到了artTemplate模板,感觉挺有意思,于是查看相关资料,自己动手写了个简单地template模板插件.虽然会有一些不足,但也是自己的一番心血.主体代码如下 /* * 一个简单地t ...
-
小程序开发--template模板
小程序的template模板可以说是我遇到的最简单的了,看看实例: <template name="article"> <view class='containe ...
-
Vue 组件&;组件之间的通信 之 template模板引用与动态组件的使用
template模板引用 在component的template中书写大量的HTML元素很麻烦. Vue提供了<template>标签,可以在里边书写HTML,然后通过ID指定到组建内的t ...
-
微信小程序template模板与component组件的区别和使用
前言: 除了component,微信小程序中还有另一种组件化你的方式template模板,这两者之间的区别是,template主要是展示,方法则需要在调用的页面中定义.而component组件则有自己 ...
-
微信小程序新闻列表功能(读取文件、template模板使用)
微信小程序新闻列表功能(读取文件.template) 不忘初心,方得始终.初心易得,始终难守. 在之前的项目基础上进行修改,实现读取文件内容作为新闻内容进行展示. 首先,修改 post.wxml 文件 ...
-
spring框架学习(六)AOP事务及spring管理事务方式之Template模板
概念 1.事务 1)事务特性:ACID 原子性 :强调事务的不可分割. 一致性 :事务的执行的前后数据的完整性保持一致. 隔离性 :一个事务执行的过程中,不应该受到其他事务的干扰. 持久性 :事务一旦 ...
随机推荐
-
说说APP接口中的版本控制
引言 接口是APP的重要组成部分,数据是APP的核心,接口是连接APP和数据的纽带. 一般情况下,APP中会有大量的接口,再加上版本的变化,接口的升级,一个接口 可能会衍生出很多个稍有差异的接口,这个 ...
-
H5图片裁剪升级版(手机版)
前段时间做了个跟裁剪相关的活动<用H5中的Canvas等技术制作海报>,这次公司要做个与奥运相关的活动,扫车牌赢奖. 于是我就在上一个活动的基础上,将代码重新封装一下,并且将计算方式写的更 ...
-
Git基本使用命令
整理Git的一些基本使用命令. # 1)克隆代码 boldseas@lian-PC MINGW64 /d/TestGroup $ git clone ssh://git@code.boldseas ...
-
xcode黑科技
1多开模拟器 使用命令行: cd /Applications/Xcode1.app/Contents/Developer/Applications/&open -n Simulator.app ...
-
When to use DataContract and DataMember attributes?
When to use DataContract and DataMember attributes? I am very confused about the DataContract attri ...
-
OCP-1Z0-042-V12.39-51题
51.Which two statements regarding archive log destinations are true? 题目解析: A(正确)因为:.归档日志最多可以配置10个 B和 ...
-
LeetCode :: Validate Binary Search Tree[具体分析]
Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less th ...
-
Nginx+IIS+asp.net mvc 实现负载均衡示例
一.Nginx官网 http://nginx.org/ 二.下载并安装Nginx 下载地址:http://nginx.org/en/download.html 启动Nginx,启动成功的话可以在任务管 ...
-
从.Net到Java学习第十篇——Spring Boot文件上传和下载
从.Net到Java学习系列目录 图片上传 Spring Boot中的文件上传就是Spring MVC中的文件上传,将其集成进来了. 在模板目录创建一个新的页面 profile/uploadPage. ...
-
spring security入门demo
一.前言 因项目需要引入spring security权限框架,而之前也没接触过这个一门,于是就花了点时间弄了个小demo出来,说实话,刚开始接触这个确实有点懵,看网上资料写的权限大都是静态,即就是在 ...