您的位置:首页 > 编程语言 > C语言/C++

c++ 模板--包含本身就是模板的参数

2016-02-19 11:51 495 查看
模板可以包含类型参数(如typename T)和非类型参数(如 int n)。模板还可以包括本身就是模板类的参数。这种参数是模板新增的特性,用于实现STL。

模板参数格式为 template<typename T>class Thing .

我们使用模板,就是为了泛型编程,如使用类型参数 typename T,就能实现相同算法下不同类型参数的统一编程。

如要实现两个数的互换,按C语言的做法,要先知道这两个数是int 型的,char型的,还是double型的,要编三个函数,重载函数。但如果用到 类型参数,直接用 T 代替int或char或double,就可以减少编程量,达到重用代码的目的。

而模板参数为 类模板 ,也是泛型编程的目的。试想一下,在一个类中,可调用一个系列的类,是不是很酷?只要这一个系列的类都有着我们需要的特征,那么我们就能通过使用一个模板类来使用它们,重用代码!

模板参数的格式为template<typename T>class Thing. 其中, template<typename T>class 为类型, Thing为参数。

我被这句话搞混了好一会儿。MB,直接跟我说怎么理解它不就得了。我们逆向去理解它。记住它是一个模板类,它的格式应为

<typename T>

class Thing{...};

对比上面的格式,推测出 只要某个 模板类 的模板参数为<typename T>,那么这个模板类就可以作为 该 模板 的参数。

STL 是C++ 上一个非常重要的概念,具体怎么个重要法,我也是听说的,我昨天google的时候,看到一句话:

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;
}


我没做注释,不好意思了啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: