类模版的定义和声明都和函数模版类似:

代码如下:

template <typename T>
class Stack
{
public:
void push(const T&);
void pop();
T top()const;
bool empty() const{return m_elems.empty();}
private:
vector<T> m_elems; };

类模版的使用时需要显示指定模版参数类型。

类模版成员函数的是在调用的时候实例化

template<typename T>
void Stack<T>::push(const T& elems)
{
m_elems.push_back(elems);
} template<typename U>
void Stack<U>::pop()
{
m_elems.pop_back();
}

参数推导过程,通过显示指定模版类型参数例如Stack<int> st;实例化一个模版类型是int的类st.pop()通过Stack<U>推导出U为int,然后依据函数模版的实例化方法实例化成员函数。

模版特化:作用是优化基于某种特定类型的实现。或者克服某种特定类型在实例化类模版时的不足。特化类模版时,同时要特化类中的成员函数,不然会造成,成员函数未定义现象。

template <>
class Stack<double>
{
public:
void push(const double&);
void pop();
double top()const;
//bool empty() const{return m_elems.empty();}
private:
vector<double> m_elems;
}; void Stack<double>::push(const double&)
{ }
void Stack<double>::pop()
{ }
double Stack<double>::top() const
{
return 0.1;
}

类模版的偏特化:偏特化也成为部分特化是特化一系列类型,实例化时不能产生二义性

根据特化,偏特化,普通实例化的优先级进行匹配

#include <iostream>
#include <string>
#include <vector>
using namespace std; template<typename T1,typename T2>
class Myclass
{ }; template<typename T>
class Myclass<T,T>
{ }; template<typename T>
class Myclass<T,int>
{ }; template<typename T1,typename T2>
class Myclass<T1*,T2*>
{ };
int main()
{
Myclass<int,float> m1;//调用第一个
Myclass<float,float> m2;//调用第二个
Myclass<float,int> m3;//调用第三个
Myclass<int*,int*> m4;//调用第四个 Myclass<int,int> m5;//产生二义性
return 0;
}

缺省模版实参

类模版缺省模版实参的优点是可以指定内部类型,以及自定义的容器

template<typename T,typename CONT = vector<T>>
class Stack
{
public:
void push(const T&);
void pop();
T top()const;
bool empty() const{return m_elems.empty();}
private:
CONT m_elems;
};

C++ Template之类模版的更多相关文章

  1. template.js 模版内调用外部JS方法

    template.js 一款 JavaScript 模板引擎,简单,好用.提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同的效果.模版定义如下: ...

  2. Template 制作模版

    直接写在选项里的模板 直接在构造器里的template选项后边编写.这种写法比较直观,但是如果模板html代码太多,不建议这么写. var vm = new Vue({ el:"#app&q ...

  3. vue中Template 制作模版

    一.直接写在选项里的模板 直接在构造器里的template选项后边编写.这种写法比较直观,但是如果模板html代码太多,不建议这么写. javascript代码: var app=new Vue({ ...

  4. .NET设计模式(16):模版方法(Template Method)(转)

    摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Te ...

  5. NET设计模式 第二部分 行为型模式(15):模版方法模式(Template Method)

    摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Te ...

  6. vue-cli的webpack模版,相关配置文件dev-server.js与webpack.config.js配置解析

    1.下载vue-cli npm install vue-cli -g vue-cli的使用与详细介绍,可以到github上获取https://github.com/vuejs/vue-cli 2.安装 ...

  7. C++设计模式 之 “组件协作”模式:Template Method、Strategy、Observer

    “组件协作”模式: #现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式. #典型模式: Templ ...

  8. c++官方文档-模版类

    #include <iostream> using namespace std; template<class T> class MyPair { private: T t[] ...

  9. Template简介

    分类   ControlTemplate ItemsPanelTemplate DataTemplate 样式Style和模板Template对比 Style:样式,风格Template:模版,某种控 ...

随机推荐

  1. MVC5 Identity 用用户名登录而不用电子邮件

    1.修改AccountViewModels ·修改RegisterViewModel public class RegisterViewModel { [Required] [Display(Name ...

  2. scala实现Netty通信

    在学习spark源码的时候看到spark在1.6之后底层的通信框架变成了akka和netty两种方式,默认的是用netty根据源码的思路用scala写了一个Demo级别的netty通信 package ...

  3. ThinkPHP常用变量

    __ROOT__  : 网站根目录地址 __APP__  : 当前项目(入口文件)地址 __GROUP__:当前分组地址 __URL__  : 当前模块地址 __ACTION__ : 当前操作地址 _ ...

  4. PHP函数:生成N个不重复的随机数

    思路:将生成的随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数. 程序: <?php /* * array unique_rand( int $min, int $max, ...

  5. andoroid项目使用Javah找不到class问题

    比如目录结构是:Soffice\bin\classes\cn\com\isoffice\util\SofficeWebService.class 进入到bin/classes 下使用命令 javah ...

  6. C# 添加系统计划任务方案

    你可以在Windows 计划任务管理器里面添加计划任务,调试OK后导出XML文件,然后在要部署的计算机上执行CMD导入命令,把计划任务信息配置导入到服务器上的计划任务列表中,命令如下: SCHTASK ...

  7. 第一节:CLR寄宿

    本系列文章来自 CLR VIA C# .NET FrameWork在Microsoft  Windows平台的顶部运行.这意味着.NET必须用Windows可以理解的技术来构建.首先,所有的托管模块和 ...

  8. Python脚本控制的WebDriver 常用操作 <六> 打印当前页面的title及url

    下面将使用WebDriver来答应浏览器页面的title和访问的地址信息 测试用例场景 测试中,访问1个页面然后判断其title是否符合预期是很常见的1个用例: 假设1个页面的title应该是'hel ...

  9. bash: 避免命令重复执行的简单脚本

    1. 根据命令生成md5做为文件名保存当前进程的pid2. 使用exec执行命令3. 如果再次执行, 使用ps -p检测上次pid是否有效, 如果是则exit 200.否则重复1.hadoop@ubu ...

  10. scjp考试准备 - 4 - 关于数组

    好吧这道题我丢脸了,竟然做错了. 如下程序的输出结果是: class Alligator{ public static void main(String[] args){ int[]x[] = {{1 ...