模板(三)

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)在泛型编程中,我们所编写的类和函数能够多态地运用于编译时不相关的类型。一个类或一个函数可以用来操纵多种类型的对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值