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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值