4.函数模板的局限性

         函数模板的通用性并不是万能的,我们自己人为定义的新的数据类型,模板不一定总能进行正确的识别与操作。

        为了解决这个问题,我们可以利用具体化的模板,解决自定义类型的通用化。
 

#include
using namespace std;

template 
void Compare(T &a, T &b)
{
    if(a == b)
    {
        cout << "a == b" << endl;
    }
    else if(a > b)
    {
        cout << "a > b" << endl;
    }
    else
    {
        cout << "a < b" << endl;
    }    
}


void test()
{
    int a = 10;
    int b = 20;
    Compare(a, b);
    
}

int main()
{
    test();
    return 0;
}

         在上面我们创建了一个函数模板,用于比较 a和b的大小,在这里由于他们都是整型,函数模板能识别并比较a和b的大小
        但是如果我们传入的是我们自定义的数据类型,比如下面:

#include
#include
using namespace std;

class Person
{
    public:
    Person(string name, int age)
    {
        Myname = name;
        Myage = age;
    }
    string Myname;
    int Myage;
};


template 
void Compare(T &a, T &b)
{
    if(a == b)
    {
        cout << "a == b" << endl;
    }
    else if(a > b)
    {
        cout << "a > b" << endl;
    }
    else
    {
        cout << "a < b" << endl;
    }    
}


void test()
{
    Person p1("Tom", 10);
    Person p2("Jack", 20);
    Compare(p1, p2);
    
}

int main()
{
    test();
    return 0;
}

        在上面的代码中,我们自定义了person类,并且通过这个person类创建了两个具体的对象p1和p2,现在我想要比较这两个人的年龄,我们继续使用上面的创建的模板,能否实现成功的比较呢?

        答案是不行,编译器报错了,编译器不知道要怎么比较两个Person类的实例化对象,因此在这里,我们需要使用函数模板重载的方法来实现对象的比较。

```cpp
#include
#include
using namespace std;

class Person
{
public:
    Person(string name, int age)
    {
        Myname = name;
        Myage = age;
    }
    
    string Myname;
    int Myage;
};

// 泛型模板函数,用于比较任意类型的对象
template 
void Compare(T &a, T &b)
{
    if(a == b)
    {
        cout << "a == b" << endl;
    }
    else if(a > b)
    {
        cout << "a > b" << endl;
    }
    else
    {
        cout << "a < b" << endl;
    }
}

// 特化模板函数,用于比较类型为 Person 的对象
template <> void Compare(Person &p1, Person &p2)
{
    if(p1.Myage == p2.Myage)
    {
        cout << "p1 == p2" << endl;
    }
    else if(p1.Myage > p2.Myage)
    {
        cout << "p1 > p2" << endl;
    }
    else
    {
        cout << "p1 < p2" << endl;
    }
}

void test()
{
    Person p1("Tom", 10);
    Person p2("Jack", 20); 
    Compare(p1, p2);
}

int main()
{
    test();
    return 0;
}
```

 运行结果

p1 < p2

        在这里,通过使用template <>关键字,特化了对类型为Person的参数进行比较的Compare函数,针对这个特定的类型提供了特殊的实现逻辑 ,成功实现两个Person对象的年龄比较

你可能感兴趣的:(STL学习笔记,c++,算法,开发语言)