1、类模板定义(主模板)
template<typename T, typename C=list<T>, int MAX=10>
class Stack{
public:
using value_type = T;
public:
Stack(const T& a):m_oContainer{move(a)}{
cout << "Stack<T,list<T>>()" << endl;
}
~Stack(){}
void push(const T& item){
m_oContainer.push_front(item);
}
void pop(){
m_oContainer.pop_front();
}
const T& top(){
return m_oContainer.front();
}
int size(){
return m_oContainer.size();
}
private:
C m_oContainer;
};
2、模板特化(偏特化)
可以理解为模板的一个特例,需要特殊处理的情况
template<>
class Stack<int, vector<int>>{
public:
Stack(const int& a):m_oContainer{move(a)}{
}
~Stack(){}
void push(const int& item){
m_oContainer.push_back(item);
}
void pop(){
m_oContainer.pop_back();
}
const int& top(){
return m_oContainer.back();
}
int size(){
return m_oContainer.size();
}
private:
vector<int> m_oContainer;
};
3、别名模板
template<typename T>
using ListStack = Stack<T, list<T>>;
4、成员类型的别名模板
template<typename T>
using ListStackValueType = Stack<T, list<T>>::value_type;
5、推导指引
说明如何转化类模板构造函数的参数类型
Stack( char const*)->Stack<string>;
完整示例代码:
#include <iostream>
#include <vector>
#include <list>
#include <vector>
using namespace std;
template<typename T, typename C=list<T>, int MAX=10>
class Stack{
public:
using value_type = T;
public:
Stack(const T& a):m_oContainer{move(a)}{
cout << "Stack<T,list<T>>()" << endl;
}
~Stack(){}
void push(const T& item){
m_oContainer.push_front(item);
}
void pop(){
m_oContainer.pop_front();
}
const T& top(){
return m_oContainer.front();
}
int size(){
return m_oContainer.size();
}
private:
C m_oContainer;
};
Stack( char const*)->Stack<string>;
template<>
class Stack<int, vector<int>>{
public:
Stack(const int& a):m_oContainer{move(a)}{
}
~Stack(){}
void push(const int& item){
m_oContainer.push_back(item);
}
void pop(){
m_oContainer.pop_back();
}
const int& top(){
return m_oContainer.back();
}
int size(){
return m_oContainer.size();
}
private:
vector<int> m_oContainer;
};
template<typename T>
using ListStack = Stack<T, list<T>>;
template<typename T>
using ListStackValueType = Stack<T, list<T>>::value_type;
int main(){
Stack a("hello");
Stack b{"hello"};
Stack c = {"hello"};
Stack d = 12;
ListStack e = 1;
ListStackValueType<char> f;
return 0;
}
标签:templates,const,int,oContainer,C++,template,Stack,模板
From: https://blog.csdn.net/qq_33271629/article/details/137369319