首页 > 代码库 > C++笔记(7):泛型编程和模板(函数模板和类模板)

C++笔记(7):泛型编程和模板(函数模板和类模板)

                    泛型编程和模板

0.泛型编程

1.函数模板

2.类模板

-----------------------------------------------------------------------------------------------------------

0.泛型编程

  所谓泛型就是以独立于任何特定类型的方式编写代码。前面介绍的标准库的容器、迭代器和算法都是泛型编程的具体应用。
  模板是泛型编程的基础。使用模板的时候不需要知道模板是如何定义的,但今天我们来介绍如何定义自己的模板类和模板函数。

-----------------------------------------------------------------------------------------------------------

1.模板基础

函数模板
如下面的比较函数:
  template <typename T>          //template 和typename 都是关键字,保持不变,变的只有类型T
  int cmp(T v1, T v2)
  {
      if(v1 > v2)
         return 1
       else if(v1 < v2)
         return -1;
   return 0;
  }
 
cmp(10, 20);
cmp(str1, str2);


编译器将实例化cmp的两个不同的版本,使用int和string代替T来生成上述两种类型的函数。
int cmp(int v1, int  v2)
{
  if(v1 > v2)
     return 1
  else if(v1 < v2)
     return -1;
  return 0;
}


int cmp(string v1, string v2)
{
  if(v1 > v2)
     return 1
  else if(v1 < v2)
     return -1;
  return 0;
}
 
可以将模板函数声明为inline函数。

template<typename T>
inline int cmp(T v1, T v2);
 
注意inline的放置位置。
 

-----------------------------------------------------------------------------------------------------------

2.类模板
类模板也是模板的一种,需要以关键字template开头后接模板形参表。
类模板的定义跟一般的类定义类似,可以有自己的数据成员和方法以及类型成员。还可以定义构造函数和析构函数。
只是在定义类和类的成员函数的时候,使用模板形参作为占位符,与内置类型或类类型使用方式完全一样。
template<typename T>
class myclass
{
 public:
    class_name();
    ~class_name();
    T func(T& t);
 private:
    T m_t;
};
 
 
类模板成员函数
模板成员函数的定义需要以关键字template关键字开始,后接模板形参表
template<typename T>
T class_name<T>::func(T& t)
{
 //.....
}
 
实例化
模板是一个蓝图,编译器使用模板产生指定的类或函数的特定类型的版本。这个过程被称为实例化。
函数模板在调用的时候就行实例化。类模板则在使用实际模板类型时进行实例化。

myclass<int> obj;
编译器在编译的时候,将int类型替换myclass模板类中的形参T。
 
泛型编程与类模板属于高级主题,这里我们不详细介绍关于它的一些零零碎碎的知识点,介绍过多会让大家有云里雾里的感觉。
当大家对C++理解到一定程序之后再来学习类模板会有更大的收货。
下面我们来介绍一个实例。实现自己的vector类。
 
 

 

C++笔记(7):泛型编程和模板(函数模板和类模板)