类模板特化

原创 2017年01月03日 16:31:03

一、主模板

#include <vector> 
#include <stdexcept> 
 
template <typename T> 
class Stack { 
private: 

//  元素
std::vector<T> elems;  


public: 

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

// pop  元素   
void pop(); 

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

// stack  是否为空 
bool empty() const {  
return elems.empty(); 

}; 
 
template <typename T> 
void Stack<T>::push (T const& elem) { 

//  追加(附于尾) 
elems.push_back(elem);   
}  
 
template <typename T> 
void Stack<T>::pop () { 
if (elems.empty()) { 
throw std::out_of_range("Stack<>::pop: empty stack"); 

//  移除最后一个元素 
elems.pop_back(); 

 
template <typename T> 
T Stack<T>::top () const { 
if (elems.empty()) { 
throw std::out_of_range("Stack<>::top: empty stack"); 

//  传回最后一个元素的拷贝 
return elems.back(); 


二、针对string的特化后的模板

你可以针对某些特殊的  template arguments, 对一个  class template 进行 「特化」 。 class templates 的特化与   function template  的重载类似,使你得以针对某些特定类型进行程序代码优化,  或修正某个特定类型在  class template  实例(instantiation) 中的错误行为 。 然而如果你对一个  class template 进行特化,就必须特化其所有成员函数。虽然你可以特化某个单独的成员函数,但一旦这么做,也就不再是特化整个  class template。


欲特化某个class template,必须以template<>  开头声明此一class,后面跟着你希望的特化结果。特化类型(specialized type)将作为template arguments 并在class名称之后直接写明: 
template<> 
class Stack<std::string> { 
... 
};  


对特化体(specializations)而言,每个成员函数都必须像常规的(一般的)成员函数那样定义, 每一个  T  出现处都必须更换为特化类型(specialized type): 
void Stack<std::string>::push (std::string const& elem) { 
elems.push_back(elem); //  将传入的  elem  附加于尾 
}


下面是一个针对  std::string  类型而特化的  Stack<>  的完整范例: 
 
#include <deque> 
#include <string> 
#include <stdexcept> 
#include "stack1.hpp" 
 
template<> 
class Stack<std::string> { 
private: 

//  元素 
std::deque<std::string> elems;   


public: 

// push  元素
void push(std::string const&); 

 // pop  元素 
void pop();

//  传回  stack  最顶端元素  
std::string top() const; 

// stack  是否为空 
bool empty() const { 
return elems.empty(); 

}; 
 
void Stack<std::string>::push (std::string const& elem) { 

//  追加元素 
elems.push_back(elem); 

 
void Stack<std::string>::pop () { 
if (elems.empty()) {  
throw std::out_of_range("Stack<std::string>::pop(): empty stack"); 

//  移除最后一个元素
elems.pop_back();  

 
std::string Stack<std::string>::top () const { 
if (elems.empty()) { 
throw std::out_of_range("Stack<std::string>::top(): empty stack"); 

 // 传回最后一个元素的拷贝 
return elems.back();

 
此例之中,我们在stack内部改用deque代替vector来管理元素。这么做并没有特别的好处,但它示范「一个特化实作码可以和其primary template(主模板。注:最原始的那一份定义)有相当程度的差异」。 

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

C++类模板的三种特化

C++类模板的三种特化 By SmartPtr(http://www.cppblog.com/SmartPtr/)  说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相...
  • kybd2006
  • kybd2006
  • 2007年11月08日 15:39
  • 9940

不一样的C++系列--类模板与特化

类模板 类模块的概念和意义 在C++中有这样一些类: 主要用于存储和组织数据元素类中数据组织的方式和数据元素的具体类型无关如:数组类,链表类,Stack类,Queue类等 C+...
  • wangzhencu
  • wangzhencu
  • 2017年07月04日 21:20
  • 207

<类模板 的 成员函数的特化>及<类 的 成员模板函数的特化>

#include "stdio.h" template class Sample { public: void print() {printf("print template\n");} };...
  • huangzeyy
  • huangzeyy
  • 2012年01月09日 09:47
  • 1426

类模板的全特化和偏特化

#include #include template class A { public: A(T1 self_str1,T2 self_str2) { printf("类模板:\n"); ...
  • crazyacm
  • crazyacm
  • 2016年09月21日 16:29
  • 447

C++模板的特化详解(函数模版特殊,类模版特化)

参照 小解C++模板特化 C++模板的特化 模板的全特化与偏特化 模版与特化的概念函数模版与类模版C++中模板分为函数模板和类模板 函数模板:是一种抽象函数定义,它代表一...
  • gatieme
  • gatieme
  • 2016年03月22日 14:40
  • 8920

C++-必知必会_模板局部特化(条款47)

/**//*********************************************** *    模板局部特化 * *          首先要声明的是,C++还不支持对函数模板的局...
  • MasterFT
  • MasterFT
  • 2007年07月14日 16:35
  • 1386

类模板特化

主类模板Stack,使用vector构建,实现栈的功能。template class Stack { private: std::vector elems; public: void...
  • qq_34256375
  • qq_34256375
  • 2016年05月08日 13:35
  • 346

类模板函数特化(专用化)specialization of …… after instantiation

 http://stackoverflow.com/questions/7774188/explicit-specialization-after-instantiation http://b...
  • brook0344
  • brook0344
  • 2016年12月03日 15:21
  • 450

c++学习(模板特化和偏特化)

模板特化和偏特化作者:谢宝陵  周 生(合肥市炮兵学院计算中心 230031)摘要:本文通过例子介绍了在 C++标准库中广泛使用的模板特化和偏特化,并指出了模板特化和偏特化的定义规则和应用规则。关键词...
  • zhang810413
  • zhang810413
  • 2007年12月18日 22:26
  • 12181

类模板的特化和函数模板的重载与类模板的继承

类似于函数模板的特化,类模板的特化也是在类模板定义以后,用template来说明一个模板的特化类型,特化的类模板甚至可以定义新的数据成员和成员函数,下面就是一个类模板特化的例子: #include ...
  • dxy408460910
  • dxy408460910
  • 2013年07月23日 09:41
  • 1022
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类模板特化
举报原因:
原因补充:

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