C++编程思想 第1卷 第16章 模板介绍 模板语法 作为模板的Int

来自IntStack.cpp的容器和迭代器,作为一般的容器类使用模板来实现的

//: C16:StackTemplate.h
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Simple stack template
#ifndef STACKTEMPLATE_H
#define STACKTEMPLATE_H
#include "../require.h"

template<class T>
class StackTemplate {
  enum { ssize = 100 };
  T stack[ssize];
  int top;
public:
  StackTemplate() : top(0) {}
  void push(const T& i) {
    require(top < ssize, "Too many push()es");
    stack[top++] = i;
  }
  T pop() {
    require(top > 0, "Too many pop()s");
    return stack[--top];
  }
  int size() { return top; }
};
#endif // STACKTEMPLATE_H ///:~

注意,模板会对它包含的对象做一定的假设

C++提供了一种弱类型机制,C++通常是强类型语言,弱类型不是坚持一个
类型是某个可接受的确切类型,而是只要求它想调用的成员函数对于一个特定
对象可用就行了

这里有一个用于检测模板的修正例子

//: C16:StackTemplateTest.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Test simple stack template
//{L} fibonacci
#include "fibonacci.h"
#include "StackTemplate.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
  StackTemplate<int> is;
  for(int i = 0; i < 20; i++)
    is.push(fibonacci(i));
  for(int k = 0; k < 20; k++)
    cout << is.pop() << endl;
  ifstream in("StackTemplateTest.cpp");
  assure(in, "StackTemplateTest.cpp");
  string line;
  StackTemplate<string> strings;
  while(getline(in, line))
    strings.push(line);
  while(strings.size() > 0)
    cout << strings.pop() << endl;
  getchar();
} ///:~

不同的是在实例is的创建中。在这个模板参数列表中,我们指明了栈和
迭代器应当存放的类型。

还需要的文件

//: C16:fibonacci.h
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Fibonacci number generator
int fibonacci(int n); ///:~
//: C16:fibonacci.cpp {O}
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#include "../require.h"

int fibonacci(int n) {
  const int sz = 100;
  require(n < sz);
  static int f[sz]; // Initialized to zero
  f[0] = f[1] = 1;
  // Scan for unfilled array elements:
  int i;
  for(i = 0; i < sz; i++)
    if(f[i] == 0) break;
  while(i <= n) {
    f[i] = f[i-1] + f[i-2];
    i++;
  }
  return f[n];
} ///:~


输出
6765
4181
2584
1597
987
610
377
233
144
89
55
34
21
13
8
5
3
2
1
1
} ///:~
  getchar();
    cout << strings.pop() << endl;
  while(strings.size() > 0)
    strings.push(line);
  while(getline(in, line))
  StackTemplate<string> strings;
  string line;
  assure(in, "StackTemplateTest.cpp");
  ifstream in("StackTemplateTest.cpp");
    cout << is.pop() << endl;
  for(int k = 0; k < 20; k++)
    is.push(fibonacci(i));
  for(int i = 0; i < 20; i++)
  StackTemplate<int> is;
int main() {

using namespace std;
#include <string>
#include <fstream>
#include <iostream>
#include "StackTemplate.h"
#include "fibonacci.h"
//{L} fibonacci
// Test simple stack template
// Copyright notice in Copyright.txt
// (c) Bruce Eckel 2000
// Available at http://www.BruceEckel.com
// From Thinking in C++, 2nd Edition
//: C16:StackTemplateTest.cpp


 

猜你喜欢

转载自blog.csdn.net/eyetired/article/details/81427632