c++ template笔记(2)模板类
1.自定义Stack模板类
#include <vector> #include <stdexcept>template <typename T> class Stack {private:std::vector<T> elems; // elementspublic:void push(T const&); // push elementvoid pop(); // pop elementT top() const; // return top elementbool empty() const { // return whether the stack is emptyreturn elems.empty();} };template <typename T> void Stack<T>::push (T const& elem) {elems.push_back(elem); // append copy of passed elem }template<typename T> void Stack<T>::pop () {if (elems.empty()) {throw std::out_of_range("Stack<>::pop(): empty stack");}elems.pop_back(); // remove last element }template <typename T> T Stack<T>::top () const {if (elems.empty()) {throw std::out_of_range("Stack<>::top(): empty stack");}return elems.back(); // return copy of last element }
测试
#include <iostream> #include <string> #include <cstdlib> #include "stack1.hpp"int main() {try {Stack<int> intStack; // stack of intsStack<std::string> stringStack; // stack of strings// manipulate int stackintStack.push(7);std::cout << intStack.top() << std::endl;// manipulate string stackstringStack.push("hello");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; // exit program with ERROR status} }
由于多掉了一次pop所以报错
2.用typdef产生一个特定模板类别名
比如Stack<int>
typedef Stack<int> IntStack; int main() {IntStack intStack;intStack.push(7);std::cout << intStack.top() << std::endl; }
3.模板类的特化
#include <deque> #include <string> #include <stdexcept> #include "stack1.hpp"template<> class Stack<std::string> {private:std::deque<std::string> elems; // elementspublic:void push(std::string const&); // push elementvoid pop(); // pop elementstd::string top() const; // return top elementbool empty() const { // return whether the stack is emptyreturn elems.empty();} };void Stack<std::string>::push (std::string const& elem) {elems.push_back(elem); // append copy of passed elem }void Stack<std::string>::pop () {if (elems.empty()) {throw std::out_of_range("Stack<std::string>::pop(): empty stack");}elems.pop_back(); // remove last element }std::string Stack<std::string>::top () const {if (elems.empty()) {throw std::out_of_range("Stack<std::string>::top(): empty stack");}return elems.back(); // return copy of last element }
基于模板类之上,对于特定类型进行重新实现,比如上面就是一个对std:: string的特例实现,内部用deque实现
测试
#include <iostream> #include <string> #include <cstdlib> #include "stack2.hpp"int main() {try {Stack<int> intStack; // stack of intsStack<std::string> stringStack; // stack of strings// manipulate int stackintStack.push(7);std::cout << intStack.top() << std::endl;intStack.pop();// manipulate string stackstringStack.push("hello");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; // exit program with ERROR status} }
上面Stack<std::string>使用了特化的类
4.局部特化
若模板类有两个参数,那么确定其中一个参数,另一个未确定的话,则可以说是局部特化
这些概念与c#的泛型是相同的.
5.预设模板
与局部特化概念差不多,但保留了参数,给参数设置了一个默认的类型
#include <vector> #include <stdexcept>template <typename T, typename CONT = std::vector<T> > class Stack {private:CONT elems; // elementspublic:void push(T const&); // push elementvoid pop(); // pop elementT top() const; // return top elementbool empty() const { // return whether the stack is emptyreturn elems.empty();} };template <typename T, typename CONT> void Stack<T,CONT>::push (T const& elem) {elems.push_back(elem); // append copy of passed elem }template <typename T, typename CONT> void Stack<T,CONT>::pop () {if (elems.empty()) {throw std::out_of_range("Stack<>::pop(): empty stack");}elems.pop_back(); // remove last element }template <typename T, typename CONT> T Stack<T,CONT>::top () const {if (elems.empty()) {throw std::out_of_range("Stack<>::top(): empty stack");}return elems.back(); // return copy of last element }
示例:这样如果用默认的类型,就可以少指定一个模板类的类型
#include <iostream> #include <deque> #include <cstdlib> #include "stack3.hpp"int main() {try {// stack of ints:Stack<int> intStack;// stack of doubles which uses a std::deque<> to manage the elementsStack<double,std::deque<double> > dblStack;// manipulate int stackintStack.push(7);std::cout << intStack.top() << std::endl;intStack.pop();// manipulate double stackdblStack.push(42.42);std::cout << dblStack.top() << std::endl; dblStack.pop();dblStack.pop();}catch (std::exception const& ex) {std::cerr << "Exception: " << ex.what() << std::endl;return EXIT_FAILURE; // exit program with ERROR status} }
转载于:https://www.cnblogs.com/Clingingboy/archive/2011/03/08/1977189.html
c++ template笔记(2)模板类相关推荐
- 学习笔记-----C++模板类中友元函数重载输出运算符时提示无法解析的外部符号解决方案
今天在写单向链表实现线性表的时候打算重载输出运算符用来将线性表输出,结果无奈又遇到了问题. 大致代码如下 <pre name="code" class="cpp&q ...
- c++ template笔记(1)模板函数
1.定义函数模板 template <typename T> inline T const& max (T const& a, T const& b) {// if ...
- 模板类 Template Classes 以及模板类编译时的处理
我们可以建立template classes,使它们能够神奇地操作任何类型的资料.下面这个例子是让CThree 类别储存三个成员变量,成员函数Min 传回其中的最小值,成员函数Max 则传回其中 ...
- 模板类的全特化、偏特化
我们先来定义一个普通的模板类 1 template<class T> 2 struct Test 3 { 4 Test(){ cout << "模板类" & ...
- C++关于DLL导出模板类和模板函数
这两天写了个Dll,要导出普通类中的模板函数,稍微查了一下,没查到具体资料.自己根据C++模板的编译原理,推断出应该要源码放在头文件中直接导出,查了下接触的Open Source项目,确实如此.这里记 ...
- 【转】C++学习三 模板类出错总结(Missing template arguments before ‘L‘)
一.模板类的说明 模板类有一个好处是可以放宽你输入的数据类型. 比如有这样的一个函数: int add(int x, int y) {return x+y; } 这个函数对于int类型的x,y才适合, ...
- Java高级语法笔记-模板类
模板类 模板类用与表示通用的数据结构和算法. 例如,定义一个类List,表示通用链表(适用于任意对象的类型) 定义模板类: class List<T>{ } 使用模板类:创建List对象时 ...
- C++ and Java template class and function 模板类和模板函数
在C++和Java的泛式编程中,模板template的使用是必不可少的,但是Java中没有template关键字,所以两者的写法还是有些许区别的,请参见如下代码: Java的模板 // Java pu ...
- ASP 模板引擎,ASP 模板类 (Taihom.Template.class)
ASP 模板引擎 如想获取最新的这个类,可以写邮件给我 '//ASP 模板引擎 (Taihom.Template.class v2.0) '//Code By Taihom '//Taihom 原创 ...
最新文章
- 开启报名丨智源论坛 · 北大教授宋令阳:超材料感知与通信
- C++知识点62——模板实参推断与函数模板的特化
- 1.3 计划需求控制
- CodeForces - 731D 80-th Level Archeology(线段树+暴力/差分)
- 边工作边刷题:70天一遍leetcode: day 97-2
- Some Important Data Structures
- ospf-3型和5型汇总
- Python 2.7.5 CentOS 6.4 编译 错误
- 计算机房设计规范2008,电子信息系统机房设计规范(GB50174-2008)(下)
- 几款实用Chrome插件
- 词法分析——词法分析器的作用
- 网络编程1之send、recv函数详解
- TC397 MCMCAN
- html5 龙,百度移动可搜龙点睛 技术创新挺进HTML5元年
- 前沿技术,目前为止功能最全最强大的PLC智能远程模块,物联网模块
- hive 复杂数据类型 在数仓中应用(array、map、struct、和其组合应用)
- 【英语学习】【WOTD】arduous 释义/词源/示例
- 如何自定义排序 aAbBcC 即Excel中的排序,AaBbCc
- oracle dba要学多久,Oracle DBA速成法的潜规则
- 淘宝商品详情API接口,商品详情API接口接入说明
热门文章
- 我对分布式多中心架构的几点看法
- 图解 Elasticsearch 原理
- 深入理解Java:注解(Annotation)基本概念
- Makefile:条件编译
- Vector 把一个vector追加到另一个vector
- Java 洛谷 P1085 不高兴的津津
- mysql实验四图书视图_[数据库实验四.doc
- “零成本”建设数据中心机房容灾方案
- servlet指定时间到现在过了多久_就喝一瓶啤酒,多久能开车?交警:过了这个时间,100%没问题...
- DL之Panoptic Segmentation:Panoptic Segmentation(全景分割)的简介(论文介绍)、全景分割挑战简介、案例应用等配图集合之详细攻略