重载 函数模板

原创 2017年01月03日 14:59:17

就像常规(意即non-template)functions一样,function templates  也可以被重载


 //  传回两个  ints  中的较大者 
inline int const& max (int const& a, int const& b) { 
return a < b ? b : a; 

 
// 传回两任意类型的数值中的较大者 
template <typename T> 
inline T const& max (T const& a, T const& b) { 
return a < b ? b : a; 

  
// 传回三个任意类型值中的最大者 
template <typename T> 
inline T const& max (T const& a, T const& b, T const& c) { 
return ::max (::max(a,b), c); 

 
int main() 

 //  调用「接受三个自变量」的函数
::max(7, 42, 68); 


 //  调用  max<double>(经由自变量推导) 
::max(7.0, 42.0);


//  调用  max<char>(经由自变量推导) 
::max('a', 'b'); 


//  调用「接受两个  int  自变量」的  non-template  函数 
::max(7, 42); 


//  调用  max<int>(经由自变量推导) 
::max<>(7, 42); 


//  调用  max<double>(无需自变量推导) 
::max<double>(7, 42); 


//  调用「接受两个  int  自变量」的  non-template  函数 
::max('a', 42.7); 

/* ICL7.1/g++ 3.2  顺利通过本例。VC6  无法把最后一个调用匹配到常规的(non-template)函数 max(), 造成编译失败 。 VC7.1  可顺利编译 , 但对倒数第二个调用给出警告 : 虽然它调用的是  function template  max(),但它发现常规函数  max()与这个调用更匹配。*/ 


这个例子说明:

1、non-template function 可以和同名的  function template 共存,也可以和其相同类型 的具现体共存。


2、当其它要素都相等时,重载解析机制会优先选择   non-template function,而不选 择由  function template 实例化后的函数实体。

::max(7, 42); //  两个自变量都是  int,吻合对应的  non-template function


3、如果可由  template  产生更佳匹配,则   template  具现体会被编译器选中

::max(7.0, 42.0); //  调用  max<double>(经由自变量推导) 
::max('a', 'b'); //  调用  max<char>(经由自变量推导)


4、调用端也可以使用空的  template argument list,这种形式告诉编译器「只从  template 具现体中挑选适当的调用对象」,所有template parameters 都自call parameters 推导而得: 
::max<>(7, 42); //  调用  max<int>(经由自变量推导) 


5、自动类型转换只适用于常规函数,在templates  中不予考虑,因此前述最后一个调用调用的是  non-template 函数。在该处,'a' 和  42.7  都被转型为  int: 
::max('a', 42.7); //  本例中只有  non-template  函数才可以接受两个不同类型的自变量 


6、总是把所有形式的重载函数写在它们被调用之前


7、重载  function templates 时,不同的重载形式之间最好只存在「绝对必要的差异」。

各重载形式之间应该只存在「参数个数的不同」或「参数类型 的明确不同」,否则可能引发各种副作用。 举个例子, 如果你以一个 「by value 形式的  max()」  重载一个「by reference 形式的  max()」 (注:两者之间的差异不够明显),就无法使用「三自变量」版本的  max()

版权声明:本文为博主原创文章,未经博主允许不得转载。

模板函数需要注意的两条重载规则

规则一:首先,特化的模板函数是不参与重载解析的。这就意味着一开始的时候,特化的版本就不会被考虑。只会考虑普通的和模板两种。如果没有普通那么就选用模板的。 规则二:然后,实例化模板。实例化之后,如果实...

以复数运算为实例的类实现、函数重载、模板类操作

首选,我们利用类来实现复数的加法,这不是我们讨论的重点,代码直接给出: #include using namespace std; class complexx { public: comp...

函数通用性之重载与(导出模板概念)

本小节主要是想通过重载来导出模板 首先来熟悉几个概念的东西: 1 什么是重写 2 什么是重载   来个小总结吧: 1 成员函数重载特征:    a 相同的范围(在同一个类中)    b 函数名字相同 ...

C++中模板类的输入输出流重载函数实现

(转)C++模板类中操作符重载之">"重载   2011-01-10 17:05:31|  分类: IT与程序 |  标签: |字号大中小 订阅 在模板类中输入流“》”...
  • lyyslsw
  • lyyslsw
  • 2012年12月30日 20:47
  • 2661

[ ]运算符重载和函数模板练习

今天上了C++课,发现听老师讲课和自己看书还是有很大区别的。自己看,就知道要看的是什么,将要学到的是什么,听老师讲课就是完全未知将要学到什么东西,将学到的那些也可能给我带来欣喜哦。 主要是运算符重载...

C++ - 函数模板(function template) 的 重载(overload) 详解 及 代码

函数模板(function template) 的 重载(overload) 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 函数模板(fu...

C++模板类与运算符作为友元函数重载

我自定义了一个模板类并重载了运算符,预定义实现功能为能实现对数组一般操作,类似于vector。 #ifndef ARRAY_H #define ARRAY_H #include using nam...

c++学习之函数模板应用和重载

c++语言提供了template关键字用于定义模板。

浅谈模板函数的重载解析优先顺序

函数模板可以被重载、显式特化重载、普通函数重载。如以下函数模板的重载声明: namespace LDQ_TEST {  //函数模板定义  template  T sum( T, int )...
  • kannju
  • kannju
  • 2011年09月01日 20:47
  • 2676
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重载 函数模板
举报原因:
原因补充:

(最多只允许输入30个字)