12.5 模板参数
模板包含类型参数(如class Type)和非类型参数(如int NUM,NUM是常量),实际上,模板的参数可以是另一个模板,也就是说,下述形式是合法的。
template<template<class T1>class T2,class T3,int Num>;
上述简单示例将原来简单的“class T2”或“Typename T2”扩充为“template<class T1>class T2”,来看以下示例代码12.11。
代码12.11 模板参数ParameterTemplate
<——————————————-文件名:Stack.h————————————————> 01 template<class T,int num>//类型参数表 02 class Stack//Stack类定义 03 { 04 private: 05 T sz[num];//存储空间,用数组表示 06 public: 07 int ReturnNum();//判断栈是否为空 08 }; 09 template<class T1,int num1>//参数列表不要求每个字都相同,但形式要相同 10 int Stack<T1,num1>:ReturnNum() 11 { 12 return num1;//返回数组大小 13 } <——————————文件名:example1211.cpp————————————————-> 14 #include<iostream> 15 #include"Stack.h" 16 using namespace std; 17 18 template<template<class Type,int NUM>class TypeClass,class T1,int N> 19 void disp()//函数模板,其类型参数表中包含一个类模板 20 { 21 TypeClass<T1,N>ob;//类模板的隐式实例化,创建对象ob 22 cout<<ob. ReturnNum()<<endl;//调用ob的public成员函数 23 } 24 25 int main() 26 { 27 disp<Stack,int,8>();//函数模板的隐式实例化,并调用 28 return 0; 29 }
输出结果如下所示。
8
【代码解析】代码第18~19行定义了函数模板disp,该模板的类型参数表中又包含了一个类模板TypeClass,在函数模板disp内可以对类TypeClass进行实例化处理。