【深度C++】之“函数模板”

0. 什么是模板

C++中的模板(template),是泛型编程的基础。一个模板就是一个蓝图,用来创建类或函数的蓝图。

模板主要分为两类:

  1. 函数模板(function template)
  2. 类模板(class template)

本文主要介绍函数模板(function template)

关于模板的全部内容,参考【C++深陷】之“模板”

1. 定义函数模板

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

// 例2
template <unsigned N, unsigned M>
int cmpchararr(const char (&p1)[N], const char (&p2)[M]) {
    return strcmp(p1, p2);
}

接下来认识名词。

template关键字是必须的。

<>中的内容,称为模板参数列表(template parameter list),包含多个由逗号,分隔开的模板参数(template parameter) ,类比函数的参数列表,注意不能为空

模板参数分为两类:

  1. 类型参数(type parameter):指定模板中的类型
  2. 非类型参数(nontype parameter):指定模板中的定值

2. 类型参数

类型参数可以看作不固定形态的类型说明符(4. 定义变量),如例1。我们可以和以往使用函数一样使用函数模板:

cout << compare(1, 9) << endl;  // T是int类型

上面的调用会在程序编译阶段进行模板的实例化(instantiate) ,告诉编译器我的T是类型int,产生一个形如下面的实例(instantiation)

int compare(const int &v1, const int &v2);

这个感觉类似于函数的形参和实参,当我们在使用模板时,会传递给模板函数模板实参(template argument),即上例中编译器根据1和9推断出的Tint

3. 非类型参数

非类型参数是一个值,需要用具体的类型来指定,如例2。当我们调用时:

cmpchararr("hi", "template");

NM分别被实例化为3和9,都是我们指定的unsigned int类型:

int cmpchararr(const char (&p1)[3], const char (&p2)[9]);
// 字符数组末尾有一个'\0'

此时我们发现,可以传递数组给函数,且无需多指定数组的维度。

用来实例化非类型整型参数的模板实参必须是常量表达式,可以是以下类型:

  1. 整型(没有浮点型
  2. 函数指针
  3. 指向具有静态性的对象的指针
  4. 绑定到具有静态性的对象的左值引用

4. 模板实参推断

此时我们发现,上述所有示例,我们并没有在代码中指定T是什么类型。这是因为当我们调用compare(1, 9)时,编译器进行了模板实参推断(template argument deduction),它帮我们推断出Tint。这种指定模板参数的方式称为隐式模板实参(implicit template argument),在类模板中,我们会接触到显示模板实参(explicit template argument)

5. inline 与 constexpr

函数模板可以声明为inline或constexpr,放在template声明之后。

6. 名词索引

  1. template关键字
  2. 模板参数列表(template parameter list)
  3. 模板参数(template parameter)
  4. 类型参数(type parameter)
  5. 非类型参数(nontype parameter)
  6. 实例化(instantiate)
  7. 实例(instantiation)
  8. 模板实参(template argument)
  9. 模板实参推断(template argument deduction)
  10. 隐式模板实参(implicit template argument)
  11. 显示模板实参(explicit template argument)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值