C++模板(template)在应用中也是很广泛,我理解的模板就是该类或者该函数可以塞入不同的数据类型,而能正确处理。
源码下载地址:git clone https://laneyu@bitbucket.org/laneyu/cplusplus.git
template目录下有本文章的完整例子
一、类模板(class templates)
1、简单使用
类模板允许类里面的函数、变量等等使用模板参数(template parameters)作为数据类型使用,如下所示:
template <typename T>
class mypair
{
public:
mypair(T first, T second)
{
values_[0] = first;
values_[1] = second;
}
void output()
{
std::cout <<values_[0] <<" " <<values_[1] <<std::endl;
}
private:
T values_[2];
};
因此,使用template方式,该类则可以适用于不同的类型,如:int, char, long等等。
如,使用该类存储两个int类型的实例
mypair<int> myobject (115, 36);
存储两个double类型的实例
mypair<double> myfloats (3.0, 2.18);
具体测试例子参考template2.cpp
2、类模板成员函数的使用
当我们需要在模板class外部定义相应的成员函数时,其和普通类使用起来有一定的区别,这是需要注意的地方,如下所示getMax函数
template <typename T>
class mypair
{
public:
mypair(T first, T second)
{
values_[0] = first;
values_[1] = second;
}
T getMax();
void output()
{
std::cout <<values_[0] <<" " <<values_[1] <<std::endl;
}
private:
T values_[2];
};
下面解释下getMax的语法:
template <class T>
T mypair<T>::getmax ()
此处,总共三个T,第一个T是模板参数(template parameter),如果定义了两个模板,则为(T1, T2),参考一下例子,第二个参数是函数返回类型,第三个T也是需要的,指明成员函数模板参数也是class模板参数。
具体测试例子参考template3.cpp
3、多个类模板的使用
有时候我们可以定义多个不同的类型,如下面的T和T2
template <typename T, typename T2>
class mypair
{
public:
mypair(T first, T second, T2 z)
{
values_[0] = first;
values_[1] = second;
z_ = z;
}
void output()
{
std::cout <<values_[0] <<" " <<values_[1] <<" " <<z_ <<std::endl;
}
private:
T values_[2];
T2 z_;
};
因此,T和T2可以是不同类型,也可以是相同类型,如T为int, T2是char类型,等等。
具体测试例子参考template4.cpp
4、模板定制化(Template specialization)
从前面可以知道采用template的class,在处理所有类型数据,如int, double,处理方式都是一样的。考虑这样的一个钟情况,我们在对一个类的里面数据进行increase的时候,如果是int类型,那么可以直接+1,但是如果是char类型,那么我们涉及到大小写字母处理就和int等类型处理方式不一样?因此,此处我们需要对char类型进行定制,采用另外的方式进行处理。如下所示:
//class template specialization
template <>
class mycontainer <char>
{
public:
mycontainer(char element)
: element_(element)
{}
char uppercase()
{
if ((element_>='a')&&(element_<='z'))
element_+='A'-'a';
return element_;
}
char lowercase()
{
if ((element_>='A')&&(element_<='Z'))
element_-='A'-'a';
return element_;
}
void output()
{
std::cout <<element_<<std::endl;
}
private:
char element_;
};
解释下template specialization的语法:
template <> class mycontainer <char> { ... };
前缀template<> 的template parameters的参数列表为空,当为空时代表template specialization。
注意类名后面,如此处的<char>,代表着该类是个char类型 template class
需要区分下以下两种定义:
template <class T> class mycontainer { ... };
template <> class mycontainer <char> { ... };
第一个是一般的template class,第二个是specialization
具体测试例子参考template5.cpp和template6.cpp
参考资料: