一些模板的写法

来源:互联网 发布:美工刀削苹果 编辑:程序博客网 时间:2024/05/02 02:50

1.被嵌套到其他类中的模板类成员函数的实现写法:

template <typename A>class X{    template <typename B> class Y    {        void foo();    };};template<typename A>template<typename B>void X<A>::Y<B>::foo(){}

2.模板类无参数

template <class>class myclass_sec{};

3.typename用于嵌套依赖名字

template <class T>class myclass{    typedef T class_type;private:        class_type m_Val;        template <typename A>    friend void init_myclass(myclass<A> & obj, typename myclass<A>::class_type new_val);};template <typename T>inline void init_myclass(myclass<T> & obj, typename myclass<T>::class_type new_val){    obj.m_Val = new_val;};
4.模板类作为模板参数使用

template <typename T>class Destructor1{public:    static void Destroy(T obj)    {        cout<<"destroy1"<<endl;    }};template <typename T>class Destructor2{public:    static void Destroy(T obj)    {        cout<<"destroy2"<<endl;    }};template <typename T, template<typename>class TDClass = Destructor1>class SmartPtr : public TDClass<T>{public:    void Release()    {        Destroy(m_pT);    }private:    T m_pT;};int _tmain(int argc, _TCHAR* argv[]){    SmartPtr<int> ptr1;    ptr1.Release();    SmartPtr<int, Destructor2> ptr2;    ptr2.Release();return 0;}
注意,TDClass使用了默认参数,可以省略,而TDClass的模板参数为空,也可以不为空,也可编译通过。运行结果:

destroy1
destroy2

也可以把SmartPtr的声明和实现分开,把默认参数写到声明中。

0 0
原创粉丝点击