C++面向对象入门(三十八)重载函数模板

函数模板存在的缺陷
1 可以支持隐式转换, 但调用优先级低
2 对于特定的数据类型的处理需要定义特殊的普通重载函数以保证功能的正确实现

 

代码示例:

#include <iostream>
using namespace std;

/*
函数模板存在的缺陷
1 可以支持隐式转换, 但调用优先级低
2 对于特定的数据类型的处理需要定义特殊的普通重载函数以保证功能的正确实现
*/

//定义函数模板max求最大值
template<typename T>
T max(T a, T b)
{
    return a > b ? a : b;
}

//将函数模板max扩展到求多个数的最大值
template<typename T>
T max(T arr[], int len)
{
    T max = arr[0];
    for (int i = 1; i < len; i++)
    {
        max = max > arr[i] ? max : arr[i];
    }
    return max;
}

//发现当前函数模板没有普通传值参数的类型转换机制, 需额外定义普通函数重载函数模板
float max(int a, float b)
{
    return a > b ? a : b;
}

float max(float a, int b)
{
    return a > b ? a : b;
}

double max(int a, double b)
{
    return a > b ? a : b;
    
}

double max(double a, int b)
{
    return a > b ? a : b;
}

//除了类型转换机制外, 又是需要特别定义某种特定类型变量的函数逻辑, 需要使用特定的普通函数重载函数模板
//比如数据类型为只需char数组的指针变量时, 默认比较大小, 比较的是两个指针的地址大小(int类型)
//而实际上我们要比较的是两个字符串的大小
//故需要使用特定的普通函数重载函数模板
//注释下面函数后, 比较字符串的功能达不到预期效果
char *max(char a[], char b[])
{
    return strcmp(a, b) > 0 ? a : b;
}

int arrLen = 0;
//重载输出长度大于等于arrLen的int数组的的前六个元素
ostream &operator<<(ostream & cout, int *t)
{
    for (size_t i = 0; i < arrLen; i++)
    {
        if (i)
            cout << " " << t[i];
        else cout << t[i] ;
    }
    return cout;
}

//重载输出长度大于等于arrLen的double数组的的前六个元素
ostream &operator<<(ostream & cout, double *t)
{
    for (size_t i = 0; i < arrLen; i++)
    {
        if (i)
            cout << " " << t[i];
        else cout << t[i];
    }
    return cout;
}



int main()
{
    int i1, i2;
    i1 = 1;
    i2 = 2;
    cout << i1 << " and " << i2 << " max is " << max(i1, i2) << endl;
    double d1, d2;
    d1 = 9.0;
    d2 = 6.6;
    cout << d1 << " and " << d2 << " max is " << max(d1, d2) << endl;
    float f1, f2;
    f1 = (float)d1;
    f2 = (float)d2;
    cout << f1 << " and " << f2 << " max is " << max(f1, f2) << endl;
    cout << i1 << " and " << f2 << " max is " << max(i1, f2) << endl;
    cout << d1 << " and " << i2 << " max is " << max(d1, i2) << endl;
    int intArr[] = { 1,2,3,4,5,6 };
    double doubleArr[] = { 1.1,2.2,3.3,4.4,5.5,6.6 };
    //设置重载的<<运算符输出数组元素个数
    arrLen = 6;
    cout << intArr << " max is " << max(intArr,6) << endl;
    cout << doubleArr << " max is " << max(doubleArr,6) << endl;
    char s1[] = "abc";
    char s2[] = "ab";
    for (size_t i = 0; i < 10; i++)
    {
        cout << s1 << " and " << s2 << " max is " << max(s1, s2) << endl;
    }
    system("pause");

}

 

posted @ 2020-09-02 18:31  DNoSay  阅读(192)  评论(0编辑  收藏  举报