zoukankan      html  css  js  c++  java
  • 模板进阶——模板实参推断

    一、关键点

    模板实参:模板参数T的实例类型,如int、string等

    模板实参推断:从函数实参来确定模板实参的过程

    模板类型参数与类型转换:const的转换、数组/函数到指针的转换

    显式模板实参:当模板参数类型并未出现在函数参数列表时

    通过函数指针推断模板实参:函数指针的类型决定了模板实参的类型

    二、模板类型参数可以运用的类型转换

    template <typename T> void func1(T, T);
    template <typename T> void func2(const T&, const T&); 
    
    int main()
    {	
    	string s1 = "hello";
    	const string s2 = "aloha";
    	func1(s1, s2);		//s2的顶层const将被忽略,调用func1(string, string) 
    	func2(s1, s2);		//将s1转换为const是允许的,调用func2(const string&, const string&) 
    	
    	int a[5], b[10];
    	func1(a, b);		//调用func1(int*, int*)
    	func2(a, b);		//错误:形参是引用,数组不会转换为指针 
    }
    

    小结:顶层const无论是在形参中还是在实参中,都会被忽略

    小结:允许将一个非const对象的引用(或指针)传递给一个const对象的引用或指针

    小结:如果函数参数不是引用类型,则可以对数组或函数类型的实参应用正常的指针转换

    注:函数参数列表中的正常类型的类型转换不受模板影响

    三、函数模板显式实参

    1. 编译器无法推断出模板实参的情况:

    template <typename T1, typename T2, typename T3>
    T1 sum(T2, T3);		//T1的类型无法判断
    
    auto ans = sum<long>(2, 3.14);	//T1显式指定为long
    

    注:显示模板实参按由左至右的顺序与对应的模板参数匹配

    注:只有右边的显式模板参数可以省略(如T2、T3,它们可以从函数参数推断出来)

    2. 正常类型转换可以应用于显式指定的实参

    template <typename T>
    bool cmp(const T&, const T&); 
    
    int main()
    {	
    	long a;
    	compare(a, 1024);		//错误
    	compare<int>(a, 1024);	//a被转换为int
    	compare<long>(a, 1024);	//1024被转换为long 
    }
    
  • 相关阅读:
    ABAP 没有地方输入H 进入DEBUG 怎么办?
    Jsoup实现java模拟登陆
    Jsoup模拟登陆例子
    Jsoup:解决java.net.UnknownHostException的问题
    Java抓取网页数据(原网页+Javascript返回数据)
    利用StringEscapeUtils对字符串进行各种转义与反转义(Java)
    MyEclipse + Tomcat 热部署问题
    管道寄售库存MRKO结算后,冲销问题
    c#操作appsettiongs
    让你的微信小程序具有在线支付功能
  • 原文地址:https://www.cnblogs.com/xzxl/p/7856629.html
Copyright © 2011-2022 走看看