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也来学习一下吧。贴上代码,大家好好理解一下。
我没做注释,不好意思了啊。
模板参数格式为 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; }
我没做注释,不好意思了啊。
相关文章推荐
- C++11::lambda 的用法
- C++Builder 2010深入TForm类之属性
- 利用C++调用天气webservice-gSOAP方法
- 自定义 C++ 中的 range() 函数
- C++ template —— 模板与继承(八)
- c++ 在windows下获取时间和计算时间差的几种方法总结
- C++标准模板库
- C语言单链表实现19个功能完全详解
- 值得推荐的C/C++框架和库 (真的很强大)
- C++ Primer Plus 札记(二)指针
- Java与C/C++比较——对象引用方面
- 《STL源码剖析》之 ROUND_UP()实现原理详解
- c++之动态库和静态库的区别
- C++中调用C函数库
- c++函数模板声明与定义相分离
- C语言深度解剖读书笔记
- c++ 设计模式4 (Strategy)
- C与C++中使用带默认值的参数
- Typical memory leak (C++中典型的内存泄露)
- 纯C语言实现简单继承机制