zoukankan      html  css  js  c++  java
  • 13--函数模板

    一.C++中的泛型编程

       --- 函数模板

            --- 提供一种特殊函数可用不同类型进行调用

            --- 类型能够被參数化

    template<typename T>
    void Swap(T& a,T& b)
    {
    	T t=a;
    	a = b;
    	b = t;
    } 

        说明: -template keyword用于声明開始泛型编程

               -typename keyword用于声明泛指的类型

       函数模板的应用

         -- 自己主动类型推导调用

         -- 详细类型显示调用

    	int a=1;
    	int b=2;
    	Swap(a,b);// 自己主动类型推导调用 
    	
    	float fa=3;
    	float fb=4;
    	Swap<float>(fa,fb);// 显示类型调用 

       对泛型编程的理解

           --- 编译器并非把函数模板处理成可以处理随意类型的函数

           --- 编译器从函数模板通过详细类型产生不同的函数

           --- 编译器会对函数模板进程两次编译

               --- 在声明的对方对函数模板代码本身进行编译 

               --- 在调用的地方对參数替换后的代码进行编译

    二. 函数模板与重载

        函数模板能够像普通函数一样被重载

        *: C++编译器优先考虑普通函数

        *: 假设函数模板能够产生一个更好的匹配。那么选择模板

        *: 能够通过空模板參数类表的语法限定编译器仅仅通过模板编译

    int Max(int a,int b)
    {
    	return a>b?

    a:b; } template<typename T> T Max(T a,T b) { cout<<"template<typename T>"<<endl; return a>b?a:b; } template<typename T> T Max(T a,T b,T c) { return Max(Max(a,b),c); } int main() { int a=1; int b=2; cout<<Max(a,b)<<endl;// 优先选择普通函数 cout<<Max<>(a,b)<<endl;// 仅仅考虑模板的匹配 return 0; }


      说明:

    	cout<<Max(a,b)<<endl;// 优先选择普通函数 
    	cout<<Max<>(a,b)<<endl;// 仅仅考虑模板的匹配 

    三. 多參数函数模板

        函数模板能够定义随意多个不同的类型模板

    template<typename T1,typename T2,typename RT>
    RT Add(T1 a,T2 b)
    {
    	return static_cast<RT>(a+b);
    }
    
    cout<<Add<char,float,double>('a',100)<<endl;

       将返回值类型參数声明到第一个參数位置。调用时仅仅需显示声明返回类型參数就可以。

    template<typename RT,typename T1,typename T2>
    RT Add(T1 a,T2 b)
    {
    	return static_cast<RT>(a+b);
    }
    cout<<Add<double>('a',100)<<endl;
    

    小结:

        (1) 函数模板事实上是一个具有同样行为的函数家族

        (2) 函数模板能够依据类型实參对函数进行推导调用

        (3) 函数模板能够显示的指定类型參数

        (4) 函数模板能够被重载













  • 相关阅读:
    September 17th 2016 Week 38th Saturday
    【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
    September 16th 2016 Week 38th Friday
    September 11th 2016 Week 38th Sunday
    September 12th 2016 Week 38th Monday
    September 10th 2016 Week 37th Saturday
    September 9th 2016 Week 37th Friday
    c++暂停
    八皇后问题
    ( 转转)Android初级开发第九讲--Intent最全用法(打开文件跳转页面等)
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7200619.html
Copyright © 2011-2022 走看看