C++ 模板与泛型编程简述

目录

1、什么是模板和泛型编程

2、定义及使用模板


1、什么是模板和泛型编程

什么是模板?什么是泛型编程?模板的概念与泛型编程是相辅相成的。想象一个场景:我们需要比较两个整数或两个字符串的大小,假如你还不知道模板的概念,那大可能会写出两个类似的函数来解决这个问题,就像下面这样:

// 对比两个整数的大小
int compare_int(int v1, int v2) { 
    if(v1 < v2)  return -1; 
    else if(v1 > v2) return 1; 
    else return 0;
}
// 对比两个字符串的大小(按字典序比较)
int compare_str(string s1, string s2) { 
    if(v1 < v2)  return -1; 
    else if(v1 > v2) return 1; 
    else return 0;
}

仔细品味这两个函数,其实两者现原理一摸一样,既然能用同样的方法实现,为何还要写两个函数呢?有没有通用的方法是用一个函数来解决呢?有的有的,函数模板就是干这种活儿的,干这活的过程就是泛型编程,这里“泛型”的意思就是“通用”的意思。除了函数模板外,还有类模板等。

2、定义及使用模板

以函数模板为例,上一节问题写成模板的形式就是下面这样:

template 
int compare(const T &v1, const T &v2){ 
    if(v1 < v2)  return -1; 
    else if(v1 > v2) return 1; 
    else return 0;
}

模板定义以关键字 template 开头,后跟一个模板参数列表,这是一个逗号分隔开的一个或多个模板参数。在模板定义过程中我们将模板参数 T (习惯用T,也可以用其他任意合法名字表示)当作替身,代替使用模板时用户提供的类型或值。

模板类型参数可以使用关键字 class 或 typename ,在模板参数列表中这两个关键字含义相同,可以互换调用,一个模板参数列表中可以同时使用这两个关键字。(为什么有两个呢?typename 是后来引入的,看起来会比 class 直观些)

template  calc(const T&, const U&);

模板的实例化及编译过程解释:

如上述 compare 函数模板,我们用 T 表示一个类型,在编译时编译器会根据函数具体的实参来自动推断模板实参类型。

另外在编译过程中,为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义,因此与非模板代码不同,函数模板和类模板成员函数的定义通常放在头文件中。(非模板函数一般是把声明放在头文件中,具体的定义放在源文件中)

你可能感兴趣的:(C++,c++,开发语言)