模板和泛型

模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector vector
您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。

函数模板

模板函数定义的一般形式如下所示:

  1. 函数模板
  2. 模板函数定义的一般形式如下所示:
  3. template <typename type> ret-type func-name(parameter list)
  4. {
  5. // 函数的主体
  6. }

类模板

正如我们定义函数模板一样,我们也可以定义类模板。泛型类声明的一般形式如下所示:

  1. template <class type> class class-name {
  2. .
  3. .
  4. .
  5. }

注意,声明或定义对象要用这种格式:

  1. ClassName<T> obj

示例代码

  1. #include <iostream>
  2. using namespace std;
  3. template< class T>
  4. class Box{
  5. public:
  6. Box(T n):num(n) { cout << "调用构造函数!" << endl; }
  7. ~Box() {
  8. cout << "调用析构函数!" << endl;
  9. }
  10. T getNum() {
  11. return num;
  12. }
  13. private:
  14. T num;
  15. };
  16. template <typename T>
  17. inline T const& mymax(T const& a, T const& b)
  18. {
  19. return a < b ? b : a;
  20. }
  21. template<typename T>
  22. const T sum(T a, T b)
  23. {
  24. return a+b;
  25. }
  26. int main()
  27. {
  28. int i = 39;
  29. int j = 20;
  30. cout << "Max(i, j): " << sum(i, j) << endl;
  31. cout << "Max(i, j): " << max(i, j) << endl;
  32. //注意,声明或定义对象要用种格式:ClassName<T> obj;
  33. Box<int> mybox(5);
  34. cout<<mybox.getNum()<<endl;
  35. Box<double> hisbox(25);
  36. cout << hisbox.getNum() << endl;
  37. }