类模板特化

原创 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(主模板。注:最原始的那一份定义)有相当程度的差异」。 

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

数组特化模板类

  • 2011年12月18日 22:05
  • 32KB
  • 下载

C++类模板的三种特化

说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相信了解的人就不是很多。我这里归纳了针对一个模板参数的类模板特化的几种类型, 一是特化为绝对类型; 二是特化为引用,指针...

C++ 的嵌套类模板的特化定义不允许写在类定义的范围内

最近在使用在使用模板特化写一段程序时发现一个奇怪的问题,比如像如下代码:   #include using namespace std; class CMyClass ...

C++类模板的特化

C++类模板的特化分为两种,一种是全特化,另一种是偏特化。 下面这个例子就是全特化#include using namespace std;template class SeqList { publ...

模板类成员函数特化写法

昨天有对模板类的函数成员特化需求,目的是为了对不同模板参数实现不同的操作,结果在写过程中碰到already defined的问题(貌似是模板新手最容易碰到的问题了),类外的成员函数和同在类外的特化版本...

类模板特化

主类模板Stack,使用vector构建,实现栈的功能。template class Stack { private: std::vector elems; public: void...

类模板的特化

类模板的特化

C++类模板的三种特化类型

说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相信了解的人就不是很多。我这里归纳了针对一个模板参数的类模板特化的几种类型, 一是特化为绝对类型; 二是特化为引用,指针...

【C++泛型编程】模板偏特化、局部类和型别映射(Int2Type,Type2Type)以及型别选择

1.模板偏特化          模板偏特化是让你在template的所有可能实体中特化出一组子集。 下面是一个模板全特化的例子,假设有一个类模板,名为Widget: template class W...

C++超基础:类模板——下、类模版的特化

一、类的特化 1、编译器会自动优先选择特化的类模版 2、函数模版和类模版的模版参数也可以是普通数值 #include using namespace std; template class...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类模板特化
举报原因:
原因补充:

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