博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ Primer Plus 学习笔记 第十四章 指针类型模板 模板多功能型 模板的具体化
阅读量:4127 次
发布时间:2019-05-25

本文共 5140 字,大约阅读时间需要 17 分钟。

程序示例

stcktp1.h

#ifndef STCKTP1_H_#define STCKTP1_H_template 
class Stack{ private: enum {SIZE = 10}; int stacksize; Type * items; int top; public: explicit Stack(int ss = SIZE); Stack(const Stack & st); ~Stack() {delete [] items;} bool isempty() {return top == 0;} bool isfull() {return top == stacksize;} bool push(const Type & item); bool pop(Type & item); Stack & operator= (const Stack & st);};template
Stack
::Stack(int ss) : stacksize(ss), top(0){ items = new Type [stacksize];}template
Stack
::Stack (const Stack & st){ stacksize = st.stacksize; top = st.top; items = new Type [stacksize]; for (int i = 0; i < top; i++) items[i] = st.items[i];}template
bool Stack
::push(const Type & item){ if (top < stacksize) { items[top++] = item; return true; } else return false;}template
bool Stack
::pop(Type & item){ if (top > 0) { item = items[--top]; return true; } else return false;}template
Stack
& Stack
::operator=(const Stack
& st){ if (this == &st) return *this; delete [] items; stacksize = st.stacksize; top = st.top; items = new Type [stacksize]; for(int i = 0; i < top; i++) items[i] = st.items[i]; return *this;}#endif

stkoptr1.cpp

#include 
#include
#include
#include "stcktp1.h"const int Num = 10;int main(){ std::srand(std::time(0)); std::cout << "Please enter stack size: "; int stacksize; std::cin >> stacksize; Stack
st(stacksize); const char* in[Num] = { "1: Hank Gilgamesh", "2: Kiki Ishtar", "3: Betty Rocker", "4: Ian Flagranti", "7: Joy Almondo", "8: Xaverie Paprika", "9: Juan Morre", "10: Misha Mache" }; const char* out[Num]; int processed = 0; int nextin = 0; while (processed < Num) { if (st.isempty()) st.push(in[nextin++]); else if(st.isfull()) st.pop(out[processed++]); else if (std::rand() % 2 && nextin < Num) st.push(in[nextin++]); else st.pop(out[processed++]); } for (int i = 0; i < Num; i++) std::cout << out[i] << std::endl; std::cout << "Bye\n"; return 0;}

表达式参数类模板:

程序示例:

arraytp.h

#ifndef ARRAYTP_H_#define ARRAYTP_H_#include 
#include
template
class ArrayTP{ private: T ar[n]; public: ArrayTP() {}; explicit ArrayTP(const T & v); virtual T & operator[] (int i); virtual T operator[] (int i) const;};template
ArrayTP
::ArrayTP(const T & v){ for (int i = 0; i < n; i++) ar[i] = v;}template
T & ArrayTP
::operator[](int i){ if (i < 0 || i >= n) { std::cerr << "Error in array limits: " << i << " is out of range\n"; std::exit(EXIT_FAILURE); } return ar[i];}template
T ArrayTP
::operator[](int i) const{ if (i < 0 || i >= n) { std::cerr << "Error in array limits: " << i << " is out of range\n"; std::exit(EXIT_FAILURE); } return ar[i];}#endif

twod.cpp

#include 
#include "arraytp.h"int main(){ using std::cout; using std::endl; ArrayTP
sums; ArrayTP
aves; ArrayTP< ArrayTP
, 10> twodee; int i, j; for (i = 0; i < 10; i++) { sums[i] = 0; for (j = 0; j < 5; j++) { twodee[i][j] = (i + 1) * (j + 1); sums[i] += twodee[i][j]; } aves[i] = (double) sums[i] / 10; } for (i = 0; i < 10; i++) { for (j = 0; j < 5; j++) { cout.width(2); cout << twodee[i][j] << ' '; } cout << ": sum = "; cout.width(3); cout << sums[i] << ", average = " << aves[i] << endl; } cout << "Done.\n"; return 0;}

运行结果:

多类型模板参数

就是模板参数是多个class

程序示例pairs.cpp

#include 
#include
using std::cout; using std::cin; using std::endl; using std::string;template
class Pair{ private: T1 a; T2 b; public: T1 & first(); T2 & second(); T1 first() const { return a;} T2 second() const { return b;} Pair(const T1 & aval, const T2 & bval) : a(aval), b(bval) {} Pair() {}};template
T1 & Pair
::first(){// 这个我是在测试调哪个first() cout << "1&"; return a;}template
T2 & Pair
::second(){ cout << "2&"; return b;}int main(){ using std::cout; using std::cin; using std::endl; using std::string; Pair
ratings[4] = { Pair
("The Purpled Duck", 5), Pair
("Jaquie's Frisco Al Fresco", 4), Pair
("Cafe Souffle", 5), Pair
("Bertie's Eats", 3) }; int joints = sizeof(ratings) / sizeof (Pair
); cout << "Rating:\t Eatery\n"; for (int i = 0; i < joints; i++) cout << ratings[i].second() << ":\t " << ratings[i].first() << endl; cout << "Oops! Revised rating:\n"; ratings[3].first() = "Bertie's Fab Eats"; ratings[3].second() = 6; cout << ratings[3].second() << ":\t " << ratings[3].first() << endl; return 0;}

类模板类型参数和非类型参数都可以指定默认值。 函数模板不支持类型参数带默认值。 但是非类型参数可以

以上都是模板隐式实例化

还有显示实例化

。。嗯。。。这有毛用?

然后是显示具体化

就是为特定具体类另外单独定义模板内容的

template <> class SortedArray<const char *> 例子中是 SortedArray<const char char*> 完全不知道为毛要多一个char

在使用char* 类的时候就会调用该显示具体化的模板

部分具体化

template<class T1> Pair<T1, int> {...} 

吧没有具体化的参数丢到前面的那个<>中去

C++调用模板的顺序:

具体化程度越高越优先调用。 有指针具体化的先调指针具体化版本。不然就用通用的转换。

完结

转载地址:http://rnepi.baihongyu.com/

你可能感兴趣的文章
Ubuntu 16.04 编译安装opencv 3.4.6过程和 anaconda3/lib/libtiff.so.5: undefined reference to `ZSTD_freeCStre
查看>>
C++ 拷贝构造和赋值构造示例
查看>>
python numpy list 多维度数组保存和读取恢复
查看>>
对抗样本 FGSM 算法代码实现 Adversarial Examples Keras Tensorflow实现
查看>>
because cuDNN failed to initialize Tensorflow 显存分配。
查看>>
ByteArrayInputStream和ByteArrayOutputStream 避免创建临时文件
查看>>
SpringBoot Hadoop HDFS目录文件下载
查看>>
CFI and SFI
查看>>
fedora 8 安装 scilab
查看>>
fc 8 安装xen
查看>>
Linux 汇编语言开发指南
查看>>
马拉松(一)
查看>>
ES TCP客户端方式自动映射mapping写入异常
查看>>
ES自定义Analyzer扩展IK分词
查看>>
记录一次系统计算逻辑优化
查看>>
创建Spring Boot项目
查看>>
Spring Boot 扫描不到Controller
查看>>
MySQL 事务隔离级别相关官方文档翻译
查看>>
Eureka服务发现与注册
查看>>
事务隔离级别与脏读、不可重复读、幻读
查看>>