1、函数模板
template <class 形参名,class 形参名,......>
返回类型 函数名(参数列表){函数体}
其中template和class是关键字,class可以用typename关见字代替,在这里typename 和class没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。
例如:
template<typename T>
inline void Singleton<T>::release()
{
if (t)
{
delete t;
t = NULL;
}
}
2、类模板
template<class 形参名,class 形参名,…>
class 类名{ ... };
类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。
例如:
template <typename T>
class Singleton
{
public:
inline static T* getInstance();
inline static void release();
virtual void initData(){};
private:
static T* t;
};
3、类模板的单例和函数模板的实现
#ifndef __SINGLETON_H__
#define __SINGLETON_H__
//类模板
template <typename T>
class Singleton
{
public:
inline static T* getInstance();
inline static void release();
virtual void initData(){};
private:
static T* t;
};
//函数模板
template <typename T>
inline T* Singleton<T>::getInstance()
{
if (!t)
{
t = new T;
t->initData();
}
return t;
}
template<typename T>
inline void Singleton<T>::release()
{
if (t)
{
delete t;
t = NULL;
}
}
//参数初始化
template <typename T>
T* Singleton<T>::t = NULL;
#endif // __SINGLE_H__