您的位置:首页 > 其它

一些模板的写法

2014-02-11 10:48 183 查看
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的声明和实现分开,把默认参数写到声明中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: