zoukankan      html  css  js  c++  java
  • 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;
    };
    
  • 相关阅读:
    windows red5相关
    redis集群及相关的使用
    c# 并行运算
    C# Thread
    html5网页录音
    netcore log4相关
    Swagger插件netcore配置
    MongoDB操作集
    .Net Core知识点
    C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别
  • 原文地址:https://www.cnblogs.com/liuweilinlin/p/3210644.html
Copyright © 2011-2022 走看看