昨天终于说完了类,今天说说模板。顾名思义,就是做模子。以前总搞不清模板和类的区别。都能够生出那么多对象。现在算是明白了,简单的说,模板模的是参数类型,可以生成不同的函数或类;类是本来就是一个自定义的类型。所以模板有函数模板和类模板之分啊。
1. 函数模板
函数模板就是说类型,不管是函数类型,还是参数类型,都是被一般化了,叫做模板参数。当模板变成一个具体的函数时,就可以将具体的类型代替这个一般化类型。这也就是说,同一个函数模板,可以具体化成类型不一样的函数。虽说功能类型,但是你是int型的,我是float型的。
定义
template
function_declaration;
template function_declaration;
两个可以看作是一回事,也就是说classs 和 typename 的作用一样。为什么?以前有人用typename,现在有都用class,但是typename也是有效的。
做个模板函数吧
- template <class myType> myType GetMax (myTye a, myType b) {
-
return (a>b?a:b);
-
}
myType 就是模板参数。
但是具体用的时候要注意,
GetMax (x, y)
看到没有,模板函数声明的时候,函数后面有个尖括号,里面就是这个具体的类型了。当然你也可以换成其他的类型。这样一个具体类型的函数就出来了,你就可以调用它了。
或者,你的输入数据的类型是确定的,也是符合一致的,那就可以直接调用。比如说,你有两个数据:
long a=10, b=8;
GetMax (a, b);
这样也可以。
1.1 模板参数扩展
你可以有一个模板参数,我也可以有两个以上的模板参数,甚至是具体的参数,只要你要需要。用的时候记得类型的一致,也就是接口一致。模板参数不一样,自然你处理的数据的类型也不一样。
2. 类模板
函数能搞模板,类同样也行。就是复杂了些。
说个例子
- template <class T> //和函数模板一样
-
class mypair { //类的声明
-
T a, b;
-
public:
-
mypair (T first, T second) //类模板的构造函数
-
{
-
a=first; b=second;
-
}
-
T getmax ();
-
-
};
-
-
template <class T> //类模板中的定义函数
-
T mypair<T>::getmax () { //第一个T是getmax的返回类型,第二个是模板参数,类模板中的函数参数,自然也是类模板的模板参数
-
T retval;
-
retval = a>b?a:b;
-
return retval;
-
}
-
-
int main () {
-
-
mypair<int> myobject (100, 75); //变成了一个int型的类,并生成了一个对象,还将其赋值。
-
cout<<myobject.getmax();
-
return 0;
-
}
看到这个没有?
mypair<int> myobject (100, 75);
先变成了一个int型的类,并生成了一个对象,还将其赋值。一气呵成。不过你要愿意,也可以将模板先特殊化。
template<> class mypair {....};
这样可以了。注意与类模板的不同之处。
templateclass mypair {...};
这其实就和函数模板特殊化一样。就是没有template <> class。
3. 类模板的其他用处
就是在做类模板的时候,模板参数可以是一些具体的参数。例如
template
class mypair {....};
C++的千变万化,不就是这些东西弄的嘛。
今天就说这了。
阅读(1168) | 评论(0) | 转发(0) |