template相关

  template模板是c++中支持多态的工具,使用模板可以使用户为类或函数声明一种一般的模式,使得该模板试用于任意类型的参数。

  函数模板

  定义如下:

template <typename T>
void swap(T& a , T& b){
    T temp;
    temp = a;
    a = b;
    b = temp;        
}

  使用如下:

#include<stdio.h>
int main(){
    int num1 = 0, num2 = 1;
    swap<int>(num1 , num2);
    printf("num1=%d,num2=%d
",num1,num2);
    return 0;  
}

  类模版:

  如果有两个类,其功能是相同的,仅仅是因为其数据结构不同,就可以通过声明一个类模版,他可以有一个或者多个虚拟的类型参数;这样就能实现“一类多用”。由于类模板包含类型参数,因此又称为参数化的类。如果说类是对象的抽象,对象是类的实例,则类模板是类的抽象,类是类模板的实例。利用类模板可以建立含各种数据类型的类。

  与普通的类相比,类模版主要有下面两处不同:

  1、在声明类模版时要加上template<class T>;

  2、原有所有的类型名如int,都要换成虚拟类型参数名T;

  定义如下:

template<class T>
class Stack{
public:
    Stack();
    ~Stack();
    void push(T t);
    T pop();
    bool isEmpty();
private:
    int m_maxSize ;
    int m_size ;
    T *m_pT ;
}

template <class  T>  Stack<T>::Stack(){
   m_maxSize = 100;      
   m_size = 0;
   m_pT = new T[m_maxSize];
}
template <class T>  Stack<T>::~Stack() {
   delete [] m_pT ;
}
        
template <class T> void Stack<T>::push(T t) {
    m_size++;
    m_pT[m_size - 1] = t;
    
}
template <class T> T Stack<T>::pop() {
    T t = m_pT[m_size - 1];
    m_size--;
    return t;
}
template <class T> bool Stack<T>::isEmpty() {
    return m_size == 0;
}

  类模版使用:

#inlcude<stdio.h>

int main(){
    Stack<int> intStack;
    intStack.push(1);
    intStack.push(2);
    intStack.push(3);
    
    while (!intStack.isEmpty()) {
        printf("num:%d
", intStack.pop());
    }
    return 0;
}    

  

  类模板的类型参数可以有一个或多个,每个类型前面都必须加class,如

template <class T1,class T2>

class someclass

{…};

  模版参数:

  模板除了有类型参数,也可以有普通的参数,也可以有默认的模板参数,例如:

template<class T, T def_val> 
class Stack{...}

  如果想要对类模版的对象数量进行限制,可是使用int参数来配置这个累的最大对象数,如下:

template <class T,int maxsize = 100> class Stack {
    public:
        Stack();
        ~Stack();
        void push(T t);
        T pop();
        bool isEmpty();
    private:
        T *m_pT;        
        int m_maxSize;
        int m_size;
};

template <class T,int maxsize> Stack<T, maxsize>::Stack(){
   m_maxSize = maxsize;      
   m_size = 0;
   m_pT = new T[m_maxSize];
}
template <class T,int maxsize>  Stack<T, maxsize>::~Stack() {
   delete [] m_pT ;
}
        
template <class T,int maxsize> void Stack<T, maxsize>::push(T t) {
    m_size++;
    m_pT[m_size - 1] = t;
    
}
template <class T,int maxsize> T Stack<T, maxsize>::pop() {
    T t = m_pT[m_size - 1];
    m_size--;
    return t;
}
template <class T,int maxsize> bool Stack<T, maxsize>::isEmpty() {
    return m_size == 0;
}

  使用如下:

#include <stdio.h>
int main() {
    int maxsize = 1024;
    Stack<int,1024> intStack;
    for (int i = 0; i < maxsize; i++) {
        intStack.push(i);
    }
    while (!intStack.isEmpty()) {
        printf("num:%d
", intStack.pop());
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jhmu0613/p/6914635.html