模板可以包含类型参数(如typename T)和非类型参数(如 int n)。模板还可以包括本身就是模板类的参数。这种参数是模板新增的特性,用于实现STL。
模板参数格式为 template<typename T>class Thing .
而模板参数为 类模板 ,也是泛型编程的目的。试想一下,在一个类中,可调用一个系列的类,是不是很酷?只要这一个系列的类都有着我们需要的特征,那么我们就能通过使用一个模板类来使用它们,重用代码!
模板参数的格式为template<typename T>class Thing. 其中, template<typename T>class 为类型, Thing为参数。
我被这句话搞混了好一会儿。MB,直接跟我说怎么理解它不就得了。我们逆向去理解它。记住它是一个模板类,它的格式应为
<typename T>
class Thing{...};
C++除了STL思想外,其它都是狗屁。(C程序员)
我没做注释,不好意思了啊。
模板参数格式为 template<typename T>class Thing .
我们使用模板,就是为了泛型编程,如使用类型参数 typename T,就能实现相同算法下不同类型参数的统一编程。
而模板参数为 类模板 ,也是泛型编程的目的。试想一下,在一个类中,可调用一个系列的类,是不是很酷?只要这一个系列的类都有着我们需要的特征,那么我们就能通过使用一个模板类来使用它们,重用代码!
模板参数的格式为template<typename T>class Thing. 其中, template<typename T>class 为类型, Thing为参数。
我被这句话搞混了好一会儿。MB,直接跟我说怎么理解它不就得了。我们逆向去理解它。记住它是一个模板类,它的格式应为
<typename T>
class Thing{...};
对比上面的格式,推测出 只要某个 模板类 的模板参数为<typename T>,那么这个模板类就可以作为 该 模板 的参数。
C++除了STL思想外,其它都是狗屁。(C程序员)
既然那么有用,咱这些coder也来学习一下吧。贴上代码,大家好好理解一下。
/* stacktp.h */
#ifndef STACKTP_H_
#define STACKTP_H_
template <class Type>
class Stack
{
private:
enum {MAX = 10};
Type items[MAX];
int top;
public:
Stack();
bool isempty();
bool isfull();
bool push(const Type & item);
bool pop(Type & item);
};
template <class Type>
Stack<Type>::Stack()
{
top = 0;
}
template <class Type>
bool Stack<Type>::isempty()
{
return top == 0;
}
template <class Type>
bool Stack<Type>::isfull()
{
return top == MAX;
}
template <class Type>
bool Stack<Type>::push(const Type &item)
{
if(top < MAX)
{
items[top++] = item;
return true;
}
else
return false;
}
template <class Type>
bool Stack<Type>::pop(Type & item)
{
if(top > 0)
{
item = items[--top];
return true;
}
else
return false;
}
#endif
/* main.cpp */
#include<iostream>
#include"stacktp.h"
using namespace std;
template <template <typename T> class Thing>
class Crab
{
private:
Thing<int> s1;
Thing<double> s2;
public:
Crab(){};
bool push(int a, double x){return s1.push(a) && s2.push(x);}
bool pop(int &a,double &x){return s1.pop(a) && s2.pop(x);}
};
int main()
{
Crab<Stack> nebula;
int ni;
double nb;
cout<<"Enter int double pairs,such as 4 3.5(0 0 to be end):\n";
while(cin >> ni >> nb && ni>0 && nb > 0)
{
if(!nebula.push(ni,nb))
break;
}
while(nebula.pop(ni,nb))
cout<< ni <<", "<< nb <<endl;
cout<< "Done.\n";
return 0;
}
我没做注释,不好意思了啊。