1、函数模板:一个独立于类型的函数,可作为一种方式,产生函数的特定类型的版本。
如:template< typename T> int compare(const T &v1,const T &v2)
{
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
模板定义以关键字template开头,后接模板形参表,模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间以逗号分隔。模板形参表不能为空。
模板形参可以是表示类型的类型形参,也可以是表达常量表达式的非类型形参。
使用函数模板时,编译器会推断哪个(或哪些)模板实参绑定到模板形参,一旦编译器确定了实际的模板实参,就称为实例化了函数模板的一个实例。
2、inline函数模板:说明符放在模板形参表之后。
如:template <typename T> inline T min(const T&,const T&);
3、类模板:必须以关键字template开头,后接模板形参表。
如:template <class Type> class Queue {
public:
//...
private:
//...
};
4、如果模板形参是类型形参,则该形参表示未知类型,如果是非类型形参,则它是一个未知值。
5、每个模板类型形参前面必须带上关键字class或typename,每个非类型形参前面必须带上类型名字,省略关键字或类型说明符是错误的。
6、在模板定义内部指定类型
如:template <class Parm, class U> Parm fcn(Parm* array,U value)
{
typename Parm::size_type *p;
}
通过在成员名前加上关键字typename 作为前缀,告诉编译器将成员当作类型。
7、在调用函数时非类型形参将用值代替,值的类型在模板形参表中指定。模板非类型形参是模板定义内部的常量值。非类型模板实参必须是编译时常量表达式。
8、一般而言,不会转换实参以匹配已有的实例化,相反,会产生新的实例。
9、使用函数模板对函数指针进行初始化或赋值
如:template <typename T> int compare(const T&,const T&)
int (*pf1)(const int&,const int&)= compare;
10、在返回类型中使用类型形参
如:template <class T1,class T2,class T3> T1 sum(T2,T3);
调用函数:long val3 = sum<long>(i,lng);
如:template <class T1,class T2,class T3> T3 alternative_sum(T2,T3);
调用函数:long val2 = alternative_sum<long , int , long >(i,lng);
11、在类本身的作用域内部,可以使用类模板的非限定名。
12、类模板成员函数的定义具有如下形式:
1)必须以关键字template开头,后接类的模板形参表。
2)必须指出它是哪个类的成员。
3)类名必须包含其模板形参。
在类外定义的成员函数的开头:
template <class T> ret-type Classname<T>::member-name
13、类模板成员函数的实例化:用模板形参定义的函数形参的实参运行进行常规转换。
14、成员模板:任意类(模板或非模板)可以拥有本身为类模板或函数模板的成员,这种成员称为成员模板,成员模板不能为虚。
当在类模板作用域外部定义成员模板的时候,必须包含两个模板形参表:
如:template <class T> template<class Iter> void Queue<T>::assign(Iter beg,Iter end)
{
destroy();
copy_elems(beg,end);
}
成员模板只有在程序中使用时才实例化。
15、模板特化:该定义中一个或多个模板形参的实际类型或实际值是指定的。
如:template<> int compare<const char*>(const char* const &v1,const char* const &v2)
{
return strcmp(v1,v2);
}
当定义非模板函数的时候,对实参应用常规转换,当特化模板的时候,对实参类型不应用转换。
16、类模板的部分特化
如:template <class T1> class some_template<T1,int>
{
};
部分特化的模板形参表是对应的类模板定义形参表的子集。
本文介绍了模板在C++中的应用,包括函数模板、inline函数模板、类模板、类型和非类型形参、模板实例化、成员模板、模板特化及部分特化。通过实例详细解析了模板的工作原理和使用技巧。
157

被折叠的 条评论
为什么被折叠?



