泛型语义

  泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意。泛型编
程的代表作品 STL 是一种高效、泛型、可交互操作的软件组件。
  泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库)。其语言支
持机制就是模板(Templates)。
  模板的精神其实很简单:类型参数化(type parameterized),即,类型也是一种参数,
也是一种静多态。 换句话说, 把一个原本特定于某个类型的算法或类当中的类型信息抽掉,
抽出来做成模板参数。

stack类

Stack 类模板化,可以 push 和 pop 不同的数据类型。主要由几个因素需要把控。栈
中的空间元素类型,压入元素类型,弹出元素类型,三者保持一致即可。

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;

class Stack{
  public:
  Stack(int size=1024){
    space = new int[size];
    top = 0;
  }

~Stack(){
  delete []space;
}

bool isEmpty(){
return top == 0;
}
bool isFull(){
return top == 1024;
}

void push(int data){
space[top++] = data;
}

int pop(){
return space[--top];
}
private:
int* space;
int top;
};
int main()
{
  Stack s(100);
  for(int i=0; i<10; ++i){
  if(!s.isFull())
  s.push(i);
  }

  while(!s.isEmpty())
  cout<<s.pop()<<endl;
  return 0;
}

类模板

格式:

应用:

ClassName<int> cn; //类模板->模板类->类对象

Stack类模板

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;

template<typename T>class Stack
{
public:
Stack(int size=1024);
~Stack();
bool isEmpty();
bool isFull();
void push(T data);
T pop();

private:

T* space;
int top;
};

template<typename T> Stack<T>::Stack(int size)
{
  space = new T[size];
  top = 0;
}
template<typename T> Stack<T>::~Stack(){
  delete []space;
}

template<typename T>bool Stack<T>::isEmpty(){
  return top == 0;
}

template<typename T>bool Stack<T>::isFull(){
  return top == 1024;
}

template<typename T>void Stack<T>::push(T data){
  space[top++] = data;
}

template<typename T> T Stack<T>::pop(){
  return space[--top];
}

int main()
{
  Stack<string> s(100);
  for(int i=0; i<10; ++i){
    if(!s.isFull())
    s.push(to_string(i)+"-abc");
  }
while(!s.isEmpty())
  cout<<s.pop()<<endl;
  return 0;
}

  类的模板本质上就是函数模板的应用,将抽象化的函数租组织到一个类 模板 内,类名的本质就是一个命名空间。

template<typename T> class XXX从格式上区别于类,完成了对类进行抽象。

 

类模板的友元

#include <iostream>
#include <istream>
#include <ostream> using namespace std; //类内实现友元
template<typename T>
class Complex
{
  friend
  istream & operator>> (istream & in, Complex<T>& c)
  {
    in>>c.real>>c.image;
    return in;
  }
  friend
  ostream & operator<< (ostream & out, Complex<T> & c)
  {
    cout<<"("<<c.real<<","<<c.image<<")"<<endl;
    return out;
  }
  private:
   T real;
   T image;
};
int main()
{
  Complex<double> c;
  cin>>c;
  cout<<c;
  return 0;
}

类外实现友元

1 )类前声明
2 )friend 类中声明 <>
3 )类外实现

#include <iostream>
#include <istream>
#include <ostream>

using namespace std;

//①类前声明
template<typename T> class Complex;
template<typename T> istream & operator>> (istream & in, Complex<T>& c);
template<typename T> ostream & operator<< (ostream & out, Complex<T> & c);
  
template<typename T>
class Complex
{

  //②freind类中声明<>
  friend istream & operator>> <>(istream & in, Complex<T>& c);
  friend ostream & operator<< <>(ostream & out, Complex<T> & c);
private:
  T real;
  T image;
};


//③类外实现
template<typename T>
istream & operator>> (istream & in, Complex<T>& c)
{
  in>>c.real>>c.image;
  return in;
}

template<typename T> ostream & operator<< (ostream & out, Complex<T> & c) 
{   
  cout<<"("<<c.real<<","<<c.image<<")"<<endl;   
  return out;
}

int main()
{
  Complex<double> c;
  cin>>c;
  cout<<c;
  return 0;
}

hpp

《C++编程思想》第 15 章(第 300 页):
  模板定义很特殊。由 template<…> 处理的任何东西都意味着编译器在当时不为它分
配存储空间, 它一直处于等待状态直到被一个模板实例告知。 在编译器和连接器的某一处,
有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部
的模板声明和定义,文件后缀为.hpp。

C++泛型编程之类模板的更多相关文章

  1. c++ 泛型编程及模板学习

    泛型编程,英文叫做Generic programming 可以理解为,具有通用意义的.普适性的,编程. 比如,你要实现一个函数去比较两个数值的大小,数值可能是int或者string.初次尝试,我们直观 ...

  2. 26.C++- 泛型编程之类模板(详解)

    在上章25.C++- 泛型编程之函数模板(详解) 学习了后,本章继续来学习类模板   类模板介绍 和函数模板一样,将泛型思想应用于类. 编译器对类模板处理方式和函数模板相同,都是进行2次编译 类模板通 ...

  3. 25.C++- 泛型编程之函数模板(详解)

    本章学习: 1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数和函数模板 当我们想写个Swap()交换函数时,通常这样写: void Swap(int& a, int&am ...

  4. C++ 模板 与 泛型编程

    C++ 模板 与 泛型编程 前言 模板有两种:类模板和函数模板 .模板是泛型编程的基础. 什么叫:泛型编程? 使用独立于特定类型的方式进行编程.也就是我们在编程的时候不明确的写上类型,而是使用一个模板 ...

  5. C/C++程序基础 (十)模板和泛型

    什么是泛型编程 基于模板,有效将算法和数据结构分离. 模板 包括类型和参数 模板函数:抽象的函数定义,代表一类同构函数.编译器在其调用位置自动完成对应模板函数的实例化. 模板类:抽象的类定义,代表更高 ...

  6. Template 基础篇-函数模板(待看

    Template 基础篇-函数模板 Template所代表的泛型编程是C++语言中的重要的组成部分,我将通过几篇blog对这半年以来的学习做一个系统的总结,本文是基础篇的第一部分. Template ...

  7. C++ 模板应用浅析

    把曾经写的C++模板的应用心得发表出来. 回忆起当时在学习C++模板时的无助和恐惧,如今还心有余悸.我分享出来我的心得,仅仅希望别人少走弯路,事实上它就这么几种使用方法,不须要害怕. 我总结了模板的四 ...

  8. C++中函数模板的概念和意义

    1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数  模板和类模板就是 C++ 中泛型编程技术,本 ...

  9. 读书笔记_Effective_C++_条款四十一:了解隐式接口和编译期多态

    从本条款开始,就进入了全书的第七部分:模板与泛型编程.模板与泛型在C++中是非常重要的部分,还记得本书第一章时,把C++视为一个联邦,它由四个州政府组成,其中一个政府就是模板与泛型了. 本条款是一个介 ...

随机推荐

  1. java02实验:方法

    一:素数输出 1.实验要求: (1)编写判断该数是否为素数的方法,并在主方法中对其进行调用. (2)注意编程规范:程序开头部分的目的,作者以及日期:必要的空格与缩进,适当的注释等: (3)实验报告中要 ...

  2. 详解递归(基础篇)———函数栈、阶乘、Fibonacci数列

    一.递归的基本概念 递归函数:在定义的时候,自己调用了自己的函数. 注意:递归函数定义的时候一定要明确结束这个函数的条件! 二.函数栈 栈:一种数据结构,它仅允许栈顶进,栈顶出,先进后出,后进先出.我 ...

  3. Redis学习——数据结构下

    4.集合(集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素.) 1.命令 .集合内操作 1.添加元素 ...

  4. Xshell、winscp连不上Linux虚拟机

    1.环境 本地机器WIN7环境,使用VMware Workstation Pro安装的CentOS7,系统镜像CentOS-6.1-x86_64-netinstall.iso 2.问题与分析 我的虚拟 ...

  5. 基于BIT数组实现全局功能开关

    前提 某一天巧合打开了sofa-bolt项目,查找部分源码,看到了项目中使用bit数组实现功能开关的特性,感觉这种方式可以借鉴,于是写下这篇文章. 原理 bit数组的布局如下: 由于每个bit都可以表 ...

  6. Scrapy入门到放弃04:下载器中间件,让爬虫更完美

    前言 MiddleWare,顾名思义,中间件.主要处理请求(例如添加代理IP.添加请求头等)和处理响应 本篇文章主要讲述下载器中间件的概念,以及如何使用中间件和自定义中间件. MiddleWare分类 ...

  7. 手写Pascal解释器(一)

    目录 一.编写解释器的动机 二.part1 三.part2 四.part3 一.编写解释器的动机 学习了Vue之后,我发现对字符串的处理对于编写一个程序框架来说是非常重要的,就拿Vue来说,我们使用该 ...

  8. shell的编程规范和变量

    目录 一.Shell脚本概述 1.shell脚本的概念 2.shell脚本应用场景 3.shell的作用--命令翻译器,"翻译官" 二.用户的登录shell 三.shell脚本的构 ...

  9. C++ 结构体案例2 升序打印数组中的元素

    1 //结构体案例 2 2 #include<iostream> 3 #include<string> 4 #include<ctime> 5 using name ...

  10. 字符串连接 strcat

    1 //字符串连接 strcat 2 //将一个字符串连接到另一个字符串的末尾,组合成一个新字符串 3 4 #include<stdio.h> 5 #include<stdlib.h ...