• 函数模板和模板函数


    一、函数模板做函数参数

    #include <iostream>
    using namespace std;
    
    template<typename T, typename T2>
    void sortArray(T *a, T2 num)
    {
    	T tmp ;
    	int i, j ;
    	for (i=0; i<num; i++)
    	{
    		for (j=i+1; j<num; j++)
    		{
    			if (a[i] < a[j])
    			{
    				tmp = a[i];
    				a[i] = a[j];
    				a[j] = tmp;
    			}
    		}
    	}
    }
    
    template<class T>
    void pirntArray(T *a, int num)
    {
    	int i = 0;
    	for (i=0; i<num; i++)
    	{
    		cout<<a[i]<<" ";
    	}
    }
    
    void main()
    {
    	int num = 0;
    	char a[] = "ddadeeettttt";
    	num = strlen(a);
    
    	printf("排序之前
    ");
    	pirntArray<char>(a, num);
    
    	sortArray<char, int>(a, num); //显示类型调用 模板函数 <>
    	printf("排序之后
    ");
    	pirntArray<char>(a, num);
    	cout<<"hello..."<<endl;
    	system("pause");
    	return ;
    }
    

      

    二、函数模板遇上函数重载

    函数模板和普通函数区别结论:

      1.函数模板不允许自动类型转化

      2.普通函数能够进行自动类型转换

    函数模板和普通函数在一起,调用规则:

             1 函数模板可以像普通函数一样被重载

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

             3 如果函数模板可以产生一个更好的匹配,那么选择模板

             4 可以通过空模板实参列表的语法限定编译器只通过模板匹配

    案例1:
    #include <iostream>
    using namespace std;
    
    template <typename T>
    void myswap(T &a, T &b)
    {
    	T t;
    	t = a;
    	a = b;
    	b = t;
    	cout<<"myswap 模板函数do"<<endl;
    }
    
    void myswap(char &a, int &b)
    {
    	int t;
    	t = a;
    	a = b;
    	b = t;
    	cout<<"myswap 普通函数do"<<endl;
    }
    
    void main()
    {
    	char cData = 'a';
    	int  iData = 2;
    
    	//myswap<int>(cData, iData);  //结论 函数模板不提供隐式的数据类型转换  必须是严格的匹配
    
    	myswap(cData, iData); 
    	//myswap(iData, cData);
    	
    	cout<<"hello..."<<endl;
    	system("pause");
    	return ;
    }
    

      

    案例2:  
    
    #include "iostream"
    using namespace std;
    
    
    int Max(int a, int b)
    {
    	cout<<"int Max(int a, int b)"<<endl;
    	return a > b ? a : b;
    }
    
    template<typename T>
    T Max(T a, T b)
    {
    	cout<<"T Max(T a, T b)"<<endl;
    	return a > b ? a : b;
    }
    
    template<typename T>
    T Max(T a, T b, T c)
    {
    	cout<<"T Max(T a, T b, T c)"<<endl;
    	return Max(Max(a, b), c);
    }
    
    
    void main()
    {
    	int a = 1;
    	int b = 2;
    
    	cout<<Max(a, b)<<endl; //当函数模板和普通函数都符合调用时,优先选择普通函数
    	cout<<Max<>(a, b)<<endl; //若显示使用函数模板,则使用<> 类型列表
    
    	cout<<Max(3.0, 4.0)<<endl; //如果 函数模板产生更好的匹配 使用函数模板
    
    	cout<<Max(5.0, 6.0, 7.0)<<endl; //重载
    
    	cout<<Max('a', 100)<<endl;  //调用普通函数 可以隐式类型转换 
    	system("pause");
    	return ;
    }
    

      

  • 相关阅读:
    redis分布式锁
    pod资源清单
    zookeeper
    [置顶]【WP】 Writeup for SJTU-CTF ,被同级大佬和学长联合虐爆
    魔术师猜数【更优解】
    数学基础之线代
    向量是什么?
    矩阵与线性变换
    线性组合、张成的空间、基
    线性代数的本质
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/9750163.html
Copyright © 2020-2023  润新知