请选择 进入手机版 | 继续访问电脑版

环信

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: mmap uikit gcc
查看: 205|回复: 0

C++泛型和函数模板template

[复制链接]

21

主题

43

帖子

140

积分

注册会员

Rank: 2

积分
140
发表于 2016-1-25 11:22:20 | 显示全部楼层 |阅读模式
泛型
    提供一种特殊的函数可用不同类型进行调用
    看起来和普通函数很相似,区别是类型可被参数化
   
    应用
        自动类型推导调用   
        具体类型显示调用

  1.         template<typename T>
  2.         void Swap(T& a, T& b)
  3.         {
  4.             T t = a;
  5.             a = b;
  6.             b = t;
  7.         }
  8.         int main(int argc, char *argv[])
  9.         {
  10.             int a = 1;
  11.             int b = 2;
  12.             Swap(a, b);
  13.             cout<<"a = "<<a<<endl;
  14.             cout<<"b = "<<b<<endl;
  15.             float fa = 3;
  16.             float fb = 4;
  17.             Swap<float>(fa, fb);
  18.             cout<<"fa = "<<fa<<endl;
  19.             cout<<"fb = "<<fb<<endl;
  20.             char ca = 'a';
  21.             char cb = 'b';
  22.             Swap(ca, cb);
  23.             cout<<"ca = "<<ca<<endl;
  24.             cout<<"cb = "<<cb<<endl;
  25.             return 0;
  26.         }
复制代码

   
函数模板的重载
    通过空模板实参列表的语法限定编译器只通过模板匹配
  1.         int Max(int a, int b)
  2.         {
  3.             cout<<"int Max(int a, int b)"<<endl;
  4.             return a > b ? a : b;
  5.         }
  6.         
  7.         template<typename T>
  8.         T Max(T a, T b)
  9.         {
  10.             cout<<"T Max(T a, T b)"<<endl;
  11.             return a > b ? a : b;
  12.         }
  13.         
  14.         template<typename T>
  15.         T Max(T a, T b, T c)
  16.         {
  17.             cout<<"T Max(T a, T b, T c)"<<endl;
  18.             return Max(Max(a, b), c);
  19.         }
  20.         
  21.         int main(int argc, char *argv[])
  22.         {
  23.             int a = 1;
  24.             int b = 2;
  25.             
  26.             cout<<Max(a, b)<<endl;
  27.             cout<<Max<>(a, b)<<endl;
  28.             
  29.             cout<<Max(3.0, 4.0)<<endl;
  30.             
  31.             cout<<Max(5.0, 6.0, 7.0)<<endl;
  32.             
  33.             cout<<Max('a', 100)<<endl;
  34.         
  35.             return 0;
  36.         }        
复制代码


函数模板不允许自动类型转化。   
当声明的类型参数为返回值类型时,无法进行自动类型推导。但是,将返回类型参数声明到第一个参数位置,调用时只需显示声明返回类型参数即可。
  1.         template<typename RT, typename T1, typename T2>
  2.         RT Add(T1 a, T2 b)
  3.         {
  4.             return static_cast<RT>(a + b);
  5.         }
  6.         
  7.         int main(int argc, char *argv[])
  8.         {
  9.             cout<<Add<double, char, float>('a', 100.0f)<<endl;
  10.             cout<<Add<double>('a', 100.0f)<<endl;
  11.         
  12.             return 0;
  13.         }
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|环信 Glofty.com ( 粤ICP备15084637号 )

GMT+8, 2017-2-28 15:58 , Processed in 0.217034 second(s), 22 queries .

快速回复 返回顶部 返回列表