你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C++——函数模板

[复制链接]
gaosmile 发布时间:2020-8-23 22:24



一、函数模板的引出:
1、c++中有几种交换变量的方法:
(1)定义宏代码块
(2)定义函数
代码版本一:
#include <iostream>
#include <string>

using namespace std;

#define SWAP(t,a,b)   \
do                    \
{                     \
     t c =a;          \
     a =b;            \
     b = c;           \
}while(0)

int main()
{
     int a =2;
     int b =5;

     SWAP(int , a , b );
     cout<<"a= "<<a<<endl;
     cout<<"b= "<<b<<endl;

     double m =4;
     double n =6;
     cout<<"m = "<<m<<endl;
     cout<<"n= "<<n<<endl;

     return 0;

}

输出结果:
root@txp-virtual-machine:/home/txp# ./a.out
a= 5
b= 2
m = 4
n= 6

注解:我们看两个数值交换成功。
我们再用使用函数的方式来实现这个功能,当然以前我们在c语言里面使用指针传参方式来实现这种两个数值直接的交换,现在我们利用c++里面更加高级的方式来实现,就是使用引用来实现(不过它的本质还是指针来实现,只是我们只用引用再不用去考虑指针的细节了)
代码版本二:
#include <iostream>
#include <string>
using namespace std;


void Swap(int& a , int& b )//const int * a ,const int * b '
{
    int c =a;
    a=b;
    b=c;
}
void Swap(double& a,double& b)
{
    double c =a;
    a=b;
    b=c;
}

void Swap( string& a, string& b)
{
    string c =a;
    a=b;
    b=c;
}
int main()
{
  int a =2;
  int b =5;

  Swap(a,b);
  cout<<"a= "<<a<<endl;
  cout<<"b= "<<b<<endl;

  double m =4;
  double n =6;
  cout<<"m= "<<m<<endl;
  cout<<"n= "<<n<<endl;

  string d = "Txp";
  string t = "xiaoping";

  cout<<"d= "<<d<<endl;
  cout<<"t= "<<t<<endl;

  return 0;
}

输出结果:
root@txp-virtual-machine:/home/txp# ./a.out
a= 5
b= 2
m= 4
n= 6
d= Txp
t= xiaoping

注解:同样实现了交换功能。
2、两种方法的优缺点:
定义宏代码块
-优点:代码复用,适合所有的类型
-缺点:编译器不知道宏的存在,缺少类型检查
定义函数
-优点:真正的函数调用,编译器对类型进行检查
-缺点:根据类型重复定义函数,无法diam复用,从上面的试验结果可以看出,我们每次都对Swap()函数进行重新定义,定参数的类型不一致的时候
二、泛型编程闪亮出场:
1、泛型编程的概念:
不考虑具体数据类型的编程方式,我们可以继续拿我们刚才的那个Swap函数进行改造,改成我们现在的泛型写过:
void Swap(T& a, T& b)
{
     T t =a;
     a =b;
     b =t;
}
注解:Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意的数据类型,这一点非常重要,明显有了很大提升。
2、C++中泛型编程
(1)函数模板:
  • -一种特殊的函数可用不同类型进行调用
  • -看起来和普通函数很相似,区别是类型可以被参数化

template<typename T>
void Swap(T& a, T& b)
{
   T t = a;
   a = b;
   b = t;
}
(2)函数模板的语法规则:
  • template关键字用于声明开始进行泛型编程
  • template关键字用于声明泛指类型

微信图片_20200823222407.png
(3)函数模板的使用
  • 自动类型推导调用
  • 具体类型显示调用

int a = 0;
int b =1;
Swap(a,b)//这里属于自动推导

float c =2;
float d =6;

Swap<float>(c,d);//这里属于显示调用
代码实践:
#include <iostream>
#include <string>
using namespace std;
template < typename T >// 开始泛型编程,泛指类型是 T;在下面函数定义中用 T 可以代表类型;
void Swap(T& a, T& b)
{
    T c =a;
    a=b;
    b=c;
}

template < typename T >
void Sort(T a[], int len)
{
   for(int i=0;i<len;i++)
   {
      for(int j=i;j<len;j++)
      {
         if(a > a[j])
         {
             Swap(a,a[j]);
         }
      }
   }

}


template < typename T >
void Println(T a[], int len)
{
      for(int i=0;i<len;i++)
      {
           cout<<a<<",";
      }
      cout<<endl;
}

int main()
{

  int a=3;
   int b=5;

   Swap(a,b);//自动推导,等价于 Swap<int>(a, b);
   cout<<"a= "<<a<<endl;
   cout<<"b= "<<b<<endl;

   double m =4;
   double n=6;

   Swap(m,n);
   cout<<"m= "<<m<<endl;
   cout<<"n= "<<n<<endl;


   string d = "Txp";
   string t ="xiaoping";

   Swap<string>(d,t);//显示指定;将 T 替换成 string,然后进行调用;
   cout<<"d= "<<d<<endl;
   cout<<"t= "<<t<<endl;




     /* 以下是选择排序算法测试代码 */
   int array[5]={3,5,6,4,9};
   Println(array,5);
   Sort(array,5);
   Println(array,5);

   string s[5]={"c","c++","rust","golang","python"};

   Println(s,5);
   Sort(s,5);
   Println(s,5);



   return 0;
}


输出结果:
vroot@txp-virtual-machine:/home/txp# ./a.out
a= 5
b= 3
m= 6
n= 4
d= xiaoping
t= Txp
3,5,6,4,9,
3,4,5,6,9,
c,c++,rust,golang,python,
c,c++,golang,python,rust,

三、总结:
  • 函数模板是泛型编程在c++中的应用方式之一
  • 函数模板能够根据实参对参数类型进行推导
  • 函数模板支持显示的指定参数类型
  • 函数模板是C++中重要的代码复用方式

好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。

收藏 评论0 发布时间:2020-8-23 22:24

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版