//简单说说 模版的原理: 其实只是为了写程序方便,编译器做了复杂的工作,编译的时候已经把模版实例化了
//目前我是这样认为的 ,不知道对不对
#include <iostream>
using namespace std;
//首先 typename 和 class 关键字 是一模一样的
//
//其次还有一个知识点,就是类模版与模版类,函数模版与模版函数
//定义就是类模版 具体的 Stack<int,20> 就是模版类
//函数模版也是同样的道理,实例化后就是模版函数了
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//还有一种特别奇怪的模版函数 模板参数仅作为函数的返回值
//调用时候 必须 unsigned short us = eshenqi_fuc<unsigned short>(2);
//这样是错误的 unsigned short us = shenqi_fuc(e3);
//其实一种是显示调用,一种是自动推导
template<class T>
shenqi_R()
{
T t = 9 ;
return t;
}
template<class T>
shenqi_fuc(int x)
{
T t = 9 +x;
return t;
}
//////////////////////////////////////////////////////////////////////////
template<typename T>
T testFun(T &x, T &y)
{
return x+y;
}
template<typename T,typename U>
void PrintFun(T x, U y)
{
cout<<x<<" "<<y<<endl;
}
//以下是模版类
template<class T>
class A
{
public:
T g(T a,T b);
A();
};
//实现部分 构造函数
template<class T>
A<T>::A()
{
}
//实现部分 成员函数 带返回值
template<class T>
T A<T>::g(T a,T b)
{
return a+b;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//带参数的模版类
template<class T,int MAXSIZE> class Stack{//MAXSIZE由用户创建对象时自行设置
private:
T elems[MAXSIZE]; // 包含元素的数组
int numElems; // 元素的当前总个数
public:
Stack(); //构造函数
void push(T const&); //压入元素
void pop(); //弹出元素
T top() const; //返回栈顶元素
bool empty() const{ // 返回栈是否为空
return numElems == 0;
}
bool full() const{ // 返回栈是否已满
return numElems == MAXSIZE;
}
};
template <class T,int MAXSIZE>
Stack<T,MAXSIZE>::Stack():numElems(0){ // 初始时栈不含元素
// 不做任何事情
}
template <class T,int MAXSIZE>
void Stack<T, MAXSIZE>::push(T const& elem){
if(numElems == MAXSIZE){
throw std::out_of_range("Stack<>::push(): stack is full");
}
elems[numElems] = elem; // 附加元素
++numElems; // 增加元素的个数
}
template<class T,int MAXSIZE>
void Stack<T,MAXSIZE>::pop(){
if (numElems <= 0) {
throw std::out_of_range("Stack<>::pop(): empty stack");
}
--numElems; // 减少元素的个数
}
template <class T,int MAXSIZE>
T Stack<T,MAXSIZE>::top()const{
if (numElems <= 0) {
throw std::out_of_range("Stack<>::top(): empty stack");
}
return elems[numElems-1]; // 返回最后一个元素
}
int main(int argc, char** argv)
{
//神奇的方法
float fus = shenqi_fuc<int>(8);// could not deduce template argument for 'T'
cout<<fus<<endl;
//
PrintFun(10,"string_info");
PrintFun(0.123,10l);
//
int dn = 5;
int an = 6;
testFun(dn,an);
//////////////////////////////////////////////////////////////////////////
A<int> a;
cout<<a.g(2,3.2)<<endl;
//////////////////////////////////////////////////////////////////////////
Stack<int,20> int20Stack; // 可以存储20个int元素的栈
Stack<int,40> int40Stack; // 可以存储40个int元素的栈
Stack<std::string,40> stringStack; // 可存储40个string元素的栈
// 使用可存储20个int元素的栈
int20Stack.push(7);
std::cout << int20Stack.top() << std::endl; //7
int20Stack.pop();
// 使用可存储40个string的栈
stringStack.push("hello");
cout<<stringStack.top().c_str()<<endl; //hello
//////////////////////////////////////////////////////////////////////////
cout<<"______________________end.."<<endl;
system("pause");
return 0;
}
评论