zoukankan      html  css  js  c++  java
  • 【c++ templates读书笔记】【1】函数模板

    1、定义函数模板:

    template<typename T>
    inline T const& Max(T const& a, T const& b){
      return a < b ? b : a;
    }
    

    解释:template表明了这是一个函数模板,<>指定了模板参数区域,typename表明了后面的参数是一个类型名, T是模板参数,它可以用来指定所有的类型,a和b是调用参数,位于模板函数名称后面,在一对()内进行声明。这里typename可以用class来取代,但最好使用typename。

    2、调用函数模板

    #include<iostream>
    #include<string>
    using namespace std;
    
    template<typename T>
    inline T const& Max(T const& a, T const& b){
    	return a < b ? b : a;
    }
    int main(){
    	cout << Max(5, 8) << endl; 
    	
    	cout << Max(3.4, -6.5) << endl;
    
    	string str1 = "math";
    	string str2 = "mathmatics";
    	cout << Max(str1, str2) << endl;
    
    	system("pause");
    	return 0;
    }
    

    调用函数模板时,模板被编译两次:

    第一次:实例化之前,检查模版代码本身,查看语法是否正确。

    第二次:在实例化期间,检查模版代码,查看是否所有的调用都有效。

    3、重载函数模板

    函数模版也可以进行重载,一个非模版函数可以和一个同名的函数模版同时存在,调用的优先级是非模板函数的优先级高。<>符号显式指定一个空的模板实参列表,告诉编译器只有模板才能匹配这个调用,而且所有的模板参数都应该根据调用实参演绎出来。函数的所有重载版本的声明都应该位于该函数被调用的位置之前。

    例子说明:

    #include<iostream>
    #include<string>
    using namespace std;
    
    inline int const& Max(int const& a, int const& b){
    	cout << "调用(1):";
    	return a < b ? b : a;
    }//(1)
    
    template<typename T>
    inline T const& Max(T const& a, T const& b){
    	cout << "调用(2):";
    	return a < b ? b : a;
    }//(2)
    template<typename T>
    inline T const& Max(T const& a, T const& b,T const& c){
    	cout << "调用(3):";
    	return Max(Max(a, b), c);
    }//(3)
    
    int main(){
    	cout << Max(7, 45, 44) << endl;//调用(3)
    	cout << Max(7.2, 5.7) << endl;//调用(2),Max<double>
    	cout << Max<>(4, 5) << endl;//调用(2),<>符号显式指定一个空的模板实参列表,告诉编译器只有模板才能匹配这个调用
    	cout << Max(4, 5) << endl;//调用(1)
    
    	system("pause");
    	return 0;
    }
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    [原创]在使用SDK 23(6.0)版本后org.apache.http相关的类找不到的解决办法
    [原创] Gradle DSL method not found: 'android()' 和 buildToolsVersion is not specified 的解决办法。
    [原创]Android Lollipop (5.0) 原生代码 Settings 首页加载逻辑分析
    访问https接口报错 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系
    js for循环中延迟 setTimeout
    ABP框架扩展AbpSession
    web在线查看PDF文件
    web在线预览office文件
    sql server游标读取excel文件数据,更新到指定表中
    echarts图形销毁重新绘制
  • 原文地址:https://www.cnblogs.com/ruan875417/p/4921348.html
Copyright © 2011-2022 走看看