dong555 发表于 2023-1-23 22:19

C++函数模板具体化和普通函数有什么区别

本帖最后由 dong555 于 2023-1-23 22:28 编辑

比较2个变量的是否相等,自己另外创建一个person结构体比较

写了一个普通模板函数template<typename T> bool compare(T& a, T& b),一个普通person结构图比较函数bool compare(person& p1, person& p2),一个模板具体化template<> bool compare(person& p1, person& p2)

运行结果普通函数bool compare(person& p1, person& p2)和模板具体化template<> bool compare(person& p1, person& p2)一样,具体有什么区别呢。

#include <iostream>
#include <string>

using namespace std;

struct person
{
      string name;
      int age;
};

template<typename T> bool compare(T& a, T& b)
{
      if (a ==b )
      {
                //cout << "a==b\n";
                return true;
      }
      else
      {
                //cout << "a!=b\n";
                return false;
      }
}

/*
bool compare(person& p1, person& p2)
{
      if (p1.name ==p2.name && p1.age == p2.age)
      {
                //cout << "person1 == person 2" << endl;
                return true;
      }
      else
      {
                //cout << "person1 != person 2" << endl;
                return false;
      }
}
*/

template<> bool compare(person& p1, person& p2)    //函数模板具体化
{
      if (p1.name == p2.name && p1.age == p2.age)
      {
                //cout << "person1 == person 2" << endl;
                return true;
      }
      else
      {
                //cout << "person1 != person 2" << endl;
                return false;
      }
}

int main()
{
      double x = 10.05;
      double y = 9;
      if (compare(x,y))
                cout << "a==b\n";
      else
                cout << "a!=b\n";

      person per1 = { "李四",25 };
      person per2 = { "李四",24 };
      if (compare(per1,per2))
      {
                cout << "person1 == person 2" << endl;
      }
      else
      {
                cout << "person1 != person 2" << endl;
      }
      return 0;
}

DEATHTOUCH 发表于 2023-1-23 23:19

本帖最后由 DEATHTOUCH 于 2023-1-23 23:21 编辑

其实你第二个这么写,和用不用template是一样的了。
真要发挥template的作用的话你得给person结构重载一个==的运算符。

补充代码:

#include <iostream>
#include <string>

using namespace std;

struct person
{
    string name;
    int age;
    bool operator==(person &a)
    {
      return this->name == a.name && this->age == a.age;
    }
};

template<typename T> bool compare(T &a, T &b)
{
    return a == b;
}

int main()
{
    double x = 10.05;
    double y = 9;
    if (compare(x, y))
      cout << "a==b\n";
    else
      cout << "a!=b\n";

    person per1 = { "李四",25 };
    person per2 = { "李四",24 };
    if (compare(per1, per2)) {
      cout << "person1 == person 2" << endl;
    }
    else {
      cout << "person1 != person 2" << endl;
    }
    return 0;
}

plauger 发表于 2023-1-24 06:09

即使你不特别具体化,模板也是会在编译期间自动具体化,自动类型推广。编译器会为你在代码中使用过的类型自动进行推广,生成相应的具体函数。你这里的具体化,其实理解为“特别化”更准确,编译器不知道你会怎么使用这个模板,允许模块特别化,目的是让你针对某些数据类型进行特别化处理,比如在你的例子中,如果两个void类型比较会怎样,person类型的比较你可以只比较性别或年龄,等等,如果不特别化,编译器的自动类型推广可能不是你想要的结果。

这一点可以参照C语言的宏,对于宏写成的比较函数来说,任何两个东西比较都是合乎语法的,但结果可能不正确,甚至编译器不会给你任何有用的提示。C++模板就是要避免这种情况发生,使程序员减少了编码工作量的同时,又提供机制限制编译器制造出预期之外的错误。

模板具体化之后与普通函数在执行效率方面是不会有任何区别,因为对于编译器来说,模板具体化之后就是普通函数。

fenginsc 发表于 2023-1-24 06:53

模版特化和偏特化一般用于模版元编程,运行时的没什么用
页: [1]
查看完整版本: C++函数模板具体化和普通函数有什么区别