C++ Template学习笔记之函数模板(7)——重载函数模板

王朝c/c++·作者佚名  2006-01-27
窄屏简体版  字體: |||超大  

函数模板可以被重载。如:

// 类模板Array的定义

template <typename Type>

class Array { /* . . . */ };

// main()的三个函数模板声明

template <typename Type>

Type min( const Array<Type>&, int ); // #1

template <typename Type>

Type min( const Type*, int ); // #2

template <typename Type>

Type min( Type, Type ); // #3

调用:

int main(){

Array<int> iA(1024); // 类实例

int ia[1024];

// Type==int; min( const Array<int>&, int )

int ival0 = min( iA, 1024 );

// Type==int; min( const int*, int )

int ival1 = min( ia, 1024 );

// Type==double; min( double, double )

double dval0 = min( sqrt( iA[0] ), sqrt( ia[0] ) );

return 0;

}

在某些情况下,即使对于一个函数调用,两个不同的函数模板都可以实例化,但是该函数调用仍然可能不是二义的。如:

template <typename Type>

Type sum( Type*, int );

template <typename Type>

Type sum( Type, int );

int ia[1024];

// Type==int; sum<int>( int*, int ); or

// Type==int*; sum<int*>( int*, int); ??

int ival1 = sum<int>( ia, 1024 );

上面的调用没有二义性,该模板是用第一个模板定义实例化的。为该实例选择的模板函数是最特化的(most specialized)。因此,Type的模板实参是int而不是int*。

一个模板要比另一个更特化,两个模板必须有相同的名字、相同的参数个数,对于不同类型的相应函数参数,如上面的T*和T,一个参数必须能接受另一个模板中相应参数能够接受的实参的超集。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航