C++泛型编程:template模板
泛型编程就是以独立于任何特定类型的方式编写代码,而模板是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 原子性 :强调事务的不可分割. 一致性 :事务的执行的前后数据的完整性保持一致. 隔离性 :一个事务执行的过程中,不应该受到其他事务的干扰. 持久性 :事务一旦 ...
随机推荐
- CSS HTML元素布局及Display属性
本篇文章主要介绍HTML的内联元素.块级元素的分类与布局,以及dispaly属性对布局的影响. 目录 1. HTML 元素分类:介绍内联元素.块级元素的分类. 2. HTML 元素布局:介绍内联元素. ...
- 神经网络、logistic回归等分类算法简单实现
最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...
- SQLServer 版本之八大方法搞清 "我是谁"
你正在使用 SQL Server 的哪个版本? 贴士:作为一个SQL Server数据库管理者或维护.支持人员,应该会经常问自己这样一个问题:我当前SQL Server版本号是?当前版本已经有的累计更 ...
- linux服务器开发一 基础
注:本文仅限交流使用,请务用于商业用途,否则后果自负! Linux 1.Linux介绍 Linux是类Unix计算机操作系统的统称. Linux操作系统的内核的名字也是“Linux”. Linux这个 ...
- slf4j
Simple Logging Facade for Java (SLF4J) slf4j可以看成是对各个日志框架的一种抽象,它提供了一套通用的日志使用接口. 下面是slf4j的几个版本比较: 1.6. ...
- 从is(":checked")说起
*此文所用jQuery版本应大于1.6.1 如何判断一个单选(复选)框是否选中. 对于刚接触jQuery的人,第一反应必然是. <input id="checkbox1" ...
- .NET基础拾遗(3)字符串、集合和流
Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...
- 匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置
0x00 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...
- 写自己的socket框架(二)
1.开始正常监听以后,就要开始接受数据了,整体流程图如下: 2.上一节看到我们在程序初始化的时候,初始化了很多个SocketConnection,用于管理客户端的链接,那应用层如何来操作,又什么时候来 ...
- dynamic-css 动态 CSS 库,使得你可以借助 MVVM 模式动态生成和更新 css,从 js 事件和 css 选择器的苦海中脱离出来
dynamic-css 使得你可以借助 MVVM 模式动态生成和更新 css,从而将本插件到来之前,打散.嵌套在 js 中的修改样式的代码剥离出来.比如你要做元素跟随鼠标移动,或者根据滚动条位置的变化 ...