• C++ Template之类模版


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

    代码如下:

    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;
    };
    
  • 相关阅读:
    mysql5.7安装
    win10 安装docker
    快速去水印(win10换图3D工具)
    爬虫---国家食品药品监督管理总局
    食品伙伴网爬虫
    驴妈妈旅游爬虫
    天气预测(CNN)
    ConcurrentDictionary线程不安全么,你难道没疑惑,你难道弄懂了么?
    C#线程篇---线程池如何管理线程(6完结篇)
    C#线程篇---Task(任务)和线程池不得不说的秘密(5)
  • 原文地址:https://www.cnblogs.com/liuweilinlin/p/3210644.html
Copyright © 2020-2023  润新知