• 模板进阶——模板实参推断


    一、关键点

    模板实参:模板参数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 
    }
    
  • 相关阅读:
    VirtualBox设置共享文件夹和镜像访问的方法
    虚拟机文件越来越大解决方案
    linux磁盘清理方法 Linux 下垃圾清理工具 BleachBit
    linux上怎么切换不同版本的arm-linux-gcc?只需改一行函数
    windows桌面添加右键环境
    各种机械键盘轴的差别,究竟什么轴好
    XML是什么,它能够做什么?——写给XML入门者
    MATLAB中导入数据:importdata函数
    理解ThreadLocal
    Leetcode:best_time_to_buy_and_sell_stock_II题解
  • 原文地址:https://www.cnblogs.com/xzxl/p/7856629.html
Copyright © 2020-2023  润新知