C++模板详细整理2

来源:互联网 发布:php有线程吗? 编辑:程序博客网 时间:2024/05/29 14:13

1 模板参数
和函数参数一样,模板参数名字程序员自己定义。通常将类型参数命名为 T 。但实际上我们可以使用任何名字。

template <typename FOO> FOO calc (const FOO& a,const FOO& b){    FOO tmp = a;//tmp的类型与参数和返回类型一样    return 0;} 

1.1**模板参数与作用域**
和普通函数一样,模板参数名作用范围是在其声明之后,直到模板声明或定义结束之前。模板内不能重用模板参数名。

1.2**模板声明**
模板声明必须包含模板参数

template <typename T>int compare(const T&, const T&);template <typename T> class Blob;

与函数参数相同,声明中的模板参数的名字不必与定义中的相同。

1.3使用类的类型成员
我们用作用域:: 来访问static成员和类型成员,在普通非模板代码中,编译器直到类的定义。因此,他知道通过作用域运算符访问的名字是类型还是static成员。
但对于模板就麻烦了。假设T是一个模板类型参数,当编译器遇到类似 T::Compare这样的代码时候,他不知道compare是一个类型成员还是一个static数据成员,直到实例化才知道。
因此,我们必须显式告诉编译器该名字是一个类型。我们通过关键字typename来实现这一点。

template <typename T>typename T::value_type top(const T& c){    if(!c.empty())        return 0;    else     {        return typename T::value_type();    }}

1.4 默认模板实参

就像我们为函数参数提供默认实参一样,我们也可以提供默认模板实参,在新标准里,我们可以为函数和类模板提供默认实参。

template <typename T,typename F = less<T> >int compare(const T &v1, const T &v2,F f = F()){    if(f(v1,v2)) return -1;    if(f(v2,v1)) return 1    return 0;}

在这段代码中,我们为模板添加了第二个类型参数,名为F,表示可调用对象的类型。并定义了一个新的函数参数f,绑定到一个可调用对象上。
1.5 成员模板
一个类,可以包含本身是模板的成员函数,这个成员被称为成员模板,当然,成员模板不能是虚函数。
普通类的成员模板