Nontype Class Template Parameters(非类型类模板参数)

原创 2017年01月03日 18:33:34

一、需求引入

上一篇博客实作了一个「元素个数可变」的stack   class。与之对比,你也可以实作另一种stack,透过一个固定大小(fixed-size)的 array来容纳元素。这样做的好处是不必考虑诸如内存管理之类的问题。然而array大小的决定是一件比较困难的事:array愈小则stack愈容易满溢,array愈大则愈容易造成空间浪费 。 一个可行的解决办法是让使用者指定array大小 , 这个大小也就是stack  的最大元素个数。


二、代码示例

 为了完成以上想法,我们应该把大小值当作一个  template parameter: 

#include <stdexcept> 
 
template <typename T, int MAXSIZE> 
class Stack { 
private: 

//  元素 
T elems[MAXSIZE]; 

//  当前的元素个数 
int numElems; 


public: 

 //  构造函数 
Stack();

// push 元素
void push(T const&); 

// pop 元素 
void pop(); 

//  传回  stack 顶端元素  
T top() const; 

// stack 是否为空 
bool empty() const { 
return numElems == 0; 
}  

// stack 是否已满 
bool full() const { 
return numElems == MAXSIZE; 

}; 
 
//  构造函数 

//  一开始并无任何元素 
template <typename T, int MAXSIZE> 
Stack<T,MAXSIZE>::Stack () : numElems(0) { 
//  不做任何事 

 
template <typename T, int MAXSIZE> 
void Stack<T,MAXSIZE>::push (T const& elem) { 
if (numElems == MAXSIZE) { 
throw std::out_of_range("Stack<>::push(): stack is full."); 

//  追加 
elems[numElems] = elem; 

//  元素总数加  1 
++numElems; 

 
template <typename T, int MAXSIZE> 
void Stack<T,MAXSIZE>::pop () { 
if (numElems <= 0) { 
throw std::out_of_range("Stack<>::pop(): empty stack."); 

//  元素总数减  1 
--numElems; 

 
template <typename T, int MAXSIZE> 
T Stack<T,MAXSIZE>::top () const { 
if (numElems <= 0) { 
throw std::out_of_range("Stack<>::top(): empty stack."); 

//  传回最后一个元素 
return elems[numElems - 1]; 


三、使用

使用上述  class template 时,必须同时指定   (1)   元素类型和   (2) stack 元素的最大数量: 
 
#include <iostream> 
#include <string> 
#include <cstdlib> 
#include "stack4.hpp" 
 
int main() { 


try { 

//  最多容纳  20  个  int  元素 
Stack<int,20> int20Stack; 

//  最多容纳  40  个  int  元素 
Stack<int,40> int40Stack; 

//  最多容纳  40  个  string  元素 
Stack<std::string,40>   stringStack; 
 
//  操控「最多容纳  20  个  int  元素」的那个  stack 
int20Stack.push(7); 
std::cout << int20Stack.top() << std::endl; 
int20Stack.pop(); 
 
//  操控「最多容纳  40  个  string  元素」的那个  stack 
stringStack.push("hello");  32 
std::cout << stringStack.top() << std::endl; 
stringStack.pop(); 

stringStack.pop(); 


} catch (std::exception const& ex) { 
std::cerr << "Exception: " << ex.what() << std::endl; 
return EXIT_FAILURE; //  传回一个错误状态码 



 
注意,每一个被实例化(instantiated) 的  class template 都有各自的类型。 (注:常见的误会是:上述三个  stacks  隶属同一类型。这是错误观念。)因此  int20Stack  和  int40Stack  是两个不同类型,不能互相进行隐式或显式转换,两者不能换用(彼此取代),也不能互相赋值。


你可以指定  non-type template parameters 的默认值: 

template <typename T = int, int MAXSIZE = 100> 
class Stack { 
... 
}; 


然而从设计角度来看,这样做并不恰当。Template parameters 的默认值应该符合大多数情况下的  要求, 然而把  int  当做预设元素类型, 或指定  stack  最多有  100  个元素, 并不符合一个 「通用型 stack」 的需求。 更好的作法是让使用者指定这两个参数的值, 并在文件中说明它们的意义

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C++ - 非类型模板参数(nontype template parameters) 使用 及 代码

非类型模板参数(nontype template parameters) 使用 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/det...

template关键字typename和class的区别,以及模板默认参数

template关键字typename和class的区别问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?template cla...

类模板(class template)友元(friend) 的全部六种形式及代码

转自http://blog.csdn.net/caroline_wendy/article/details/16916441 类模板(class template)的友元(friend)和普通类...

C++ - 类模板(class template) 详解 及 代码

类模板(class template) 详解 及 代码   本文地址: http://blog.csdn.net/caroline_wendy   类模板(class template)需要添加模板参...

C++ 模板类=设计 or template class operator=

设计一个模板类,某个成员变量是在调用的时候才能知道其具体类型。设计重载运算符=。需要特别重视的是: Vec 与Vec 是不同的类型,不同类型之间的赋值,会默认调用类型转换函数。模板类// undef...

C++类模板 template <class T>

类模板与函数模板的定义和使用类似,我们已经进行了介绍,如果您对函数模板也感兴趣,请查看:。 有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类: class Com...

XCode5添加新建类模板(Cocos2dx Template Class for Scene or Layer)

猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢!原文地址: http://www.cocos2dev.com/?p=505因为常用cocos2dx开发游...

C++ - 类模板(class template)友元(friend) 的 全部六种形式 及 代码

类模板(class template)友元(friend) 的 全部六种形式 及 代码   版权所有, 禁止转载, 如有需要, 请站内联系; 本文地址: http://blog.csdn.net/ca...

The Java™ Tutorials — Generics :Bounded Type Parameters 受限的类型参数

The Java™ Tutorials — Generics :Bounded Type Parameters 受限的类型参数 原文地址:https://docs.oracle.com/java...

template<class T>函数模板

函数模板( Function templates) 模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Nontype Class Template Parameters(非类型类模板参数)
举报原因:
原因补充:

(最多只允许输入30个字)