第16章 模板与泛型编程(2)
16.1.2 定义类模板
template <class Type>
class Queue{
public:
Queue();
Type &front();
const Type &front() const;
void push(const Type &);
void pop();
bool empty() const;
private:
};
template <class Type>
class Queue{
public:
Queue();
Type &front();
const Type &front() const;
void push(const Type &);
void pop();
bool empty() const;
private:
};类模板也是模板,因此必须以关键字template开头,后接模板形参表。Queue模板接受一个名为Type的模板类型形参。
除了模板形参表外,类模板的定义看起来与任意其他类相似。类模板可以定义数据成员、函数成员和类型成员,也可以使用访问标号控制对成员的访问,还可以定义构造函数和析构函数等等。在类和类成员的定义中,可以使用模板形参作为类型或值的占位符,在使用类时再提供那些类型或值。
与调用函数模板形成对比,使用类模板时,必须对模板形参显式指定实参。
Queue<int> iq;
Queue<vector<int>> vq;
Queue<int> iq;
Queue<vector<int>> vq;编译器使用实参来实例化这个类的特定类型版本。
16.1.3 模板形参
像函数形参一样,程序员为模板形参选择的名字没有本质含义。模板形参的命名可以为T,但也可以将它命名为任意名字。
可以给模板形参赋予的唯一含义是区别形参是类型形参还是非类型形参。如果是类型形参,我们就知道该形参表示未知类型,如果是非类型形参,我们就知道它是一个未知值。
如果希望使用模板形参所表示的类型或值,可以使用与对应模板形参相同的名字。
1. 模板形参作用域
模板形参的名字可以在声明为模板形参之后直到模板声明或定义的末尾处使用。
模板形参遵循常规名字屏蔽规则。与全局作用域中声明的对象、函数或类型同名的模板形参会屏蔽全局名字。
typedef double T;
template <typename T> inline //global T was hided.
const T &the_min(const T &v1, const T &v2){
if(compare(v1, v2)==-1)
return v1;
else
return v2;
}
typedef double T;
template <typename T> inline //global T was hided.
const T &the_min(const T &v1, const T &v2){
if(compare(v1, v2)==-1)
return v1;
else
return v2;
}2. 使用模板形参名字的限制
用作模板形参的名字不能在模板内部重用。
正如重用函数形参一样,模板形参的名字可能在不同模板中重用。
3. 模板声明
像其他任意函数或类一样,对于模板可以只声明而不定义。声明必须指出函数或类是一个模板。
template <typename T> inline //global T was hided.
const T &the_min(const T &v1, const T &v2);
template <typename T> inline //global T was hided.
const T &the_min(const T &v1, const T &v2);
同一模板声明和定义中,模板形参的名字不必相同。
每个模板类型形参前面必须带上关键字class或typename,每个非类型形参前面必须带上类型名字,省略关键字或类型说明符是错误的。
摘自 xufei96的专栏
补充:软件开发 , C++ ,