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;
};
原文地址:https://www.cnblogs.com/liuweilinlin/p/3210644.html