模板——参数推导与特例化

模板实参推断

对于函数模板,编译器利用调用中的函数实参来确定其模板参数。从函数实参来确定模板实参的过程被称为模板实参推断(template argument deduction)。在模板实参推断过程中,编译器使用函数调用中的实参类型来寻找模板实参,用这些模板实参生成的函数版本与给定的函数调用最为匹配。与非模板函数一样,在一次调用中传递给函数模板的实参被用来初始化函数的形参。

模板特例化

编写单一模板使之对任何可能的模板实参都是最合适的,这并不总能办到。在某些情况下,通用模板的定义对特定类型是不合适的:通用定义可能编译失败或做得不正确。或者通用模板对于某些模板实参的处理并不高效。因此编写特例化的模板就成为了必要。

模板函数特例化

当我们特例化一个函数模板时,必须为原模板中的每个模板参数都提供实参。为了指出我们正在实例化一个模板,应使用关键字template后面跟一个空尖括号对。空尖括号对指出我们将为原模板的所有模板参数提供实参。

当定义函数模板的特例化版本时,我们本质上接管了编译器的工作。即,我们为原模板的一个特殊实例提供了定义。重要的是要弄清:一个特例化版本本质上是一个实例,而非函数名的一个重载版本。因此特例化并不影响函数匹配。

类模板特例化

类模板的特例化分为全特例化(全特化)和部分特例化(偏特化)两种。全特化的语法与函数模板特例化大体相同。

偏特化

当我们只指定一部分而非所有模板参数,或是参数的一部分而非全部特性时,即为类模板的偏特化。在《泛型思维》中偏特化的定义是:针对(任何)模板参数更进一步的条件限制所设计出来的一个特化版本。一个类模板的偏特化本身还是一个模板而不是一个实例。因此使用偏特化版本的模板时也必须为那些在特例化版本中未指定的模板参数提供实参。

                                                                                        本文部分内容摘自《C++ Primer 中文版(第五版)》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值