`
cloudtech
  • 浏览: 4595531 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

// 类模板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,一个参数必须能接受另一个模板中相应参数能够接受的实参的超集。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics