1.缺省模板参数
#ifndef __INCLUDE_STACK_H__
#define __INCLUDE_STACK_H__
#include <iostream>
#include <exception>
#include <string.h>
#include <stdexcept>
#include <queue>
using namespace std;
template<typename T,typename CONT = deque<T> >
class Stack
{
public:
Stack();
~Stack();
void Push(const T &elem);
void Pop();
T & Top ();
const T & Top() const;
bool Empty() const ;
private:
CONT c_;
};
template<typename T,typename CONT>
Stack<T,CONT>::Stack()
{
}
template<typename T,typename CONT>
Stack<T,CONT>::~Stack()
{
}
template<typename T,typename CONT>
void Stack<T,CONT>::Push(const T &elem)
{
c_.push_back(elem);
}
template<typename T,typename CONT>
void Stack<T,CONT>::Pop()
{
c_.pop_back();
}
template<typename T,typename CONT>
T & Stack<T,CONT>::Top()
{
return c_.back();
}
template<typename T,typename CONT>
const T &Stack<T,CONT>::Top() const
{
return c_.back();
}
template<typename T,typename CONT>
bool Stack<T,CONT>::Empty() const
{
return c_.empty();
}
#endif //__INCLUDE_STACK_H__
#include <iostream>
#include "Stack2.h"
using namespace std;
int main()
{
try
{
Stack<int,vector<int> > s;
s.Push(1);
s.Push(2);
s.Push(3);
s.Push(4);
s.Push(5);
while( !s.Empty())
{
cout<<s.Top()<<endl;
s.Pop();
}
}
catch (out_of_range &oor)
{
cout<<"Out ofRange error:"<<oor.what()<<endl;
}
return 0;
}
2.成员模板
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
template<typename T>
class MyClass {
public:
MyClass():value(0) {
}
template<typename U>
MyClass(const MyClass<U>& x) {
value = x.GetValue();
}
template<typename U>
void Assign(const MyClass<U>& x) {
//value = x.value;
value = x.GetValue();
}
T GetValue() const { return value; }
private:
T value;
};
int main() {
MyClass<int> i;
MyClass<double> d;
d.Assign(d);
d.Assign(i);
cout << d.GetValue() << endl;
MyClass<double> d2(i);
return 0;
}
//std::auto_ptr
//
//auto_ptr<X> x;
//auto_ptr<Y> y;
//x = y;
3.关键字typename
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
template<typename T>
class MyClass {
public:
private:
typename T::SubType* ptr_;
};
class Test {
public:
typedef int SubType;
};
int main() {
MyClass<Test> mc;
return 0;
}
4.派生类和模板
(1)为了运行的效率,类模板是相互独立的,即独立设计,没有使用继承的思想。对类模板的扩展是采用适配器(adapter)来完成的。通用性是模板库设计出发点之一,这是由泛型编程和函数对象等手段达到的
(2)派生的目标之一也是代码的复用和程序的通用性,最典型的就是MFC,派生类的优点是可以有简到繁,逐步深入,程序编制过程中可以充分利用前面的工作,一步步完成一个复杂的任务
(3)模板追求的是运行标率,而派生追求的是编程的效率
5.面向对象和泛型编程
(1)面向对象与泛型编程都依赖于某个形式的多态
(2)面向对象(动态多态),泛型编程(静态多态)
(3)面向对象中的多态在运行时应用存在继承关系。我们编写使用这类的代码,忽略基类与派生类之间的类型差异。只要使用基类指针或者引用,基类类型对象,派生类类型对象可以共享相同代码
(4)在泛型编程中,我们所编写的类和函数能够多态地运用于编译时不相关的类型。一个类或一个函数可以用来操纵多种类型的对象