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: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;
} 即使你不特别具体化,模板也是会在编译期间自动具体化,自动类型推广。编译器会为你在代码中使用过的类型自动进行推广,生成相应的具体函数。你这里的具体化,其实理解为“特别化”更准确,编译器不知道你会怎么使用这个模板,允许模块特别化,目的是让你针对某些数据类型进行特别化处理,比如在你的例子中,如果两个void类型比较会怎样,person类型的比较你可以只比较性别或年龄,等等,如果不特别化,编译器的自动类型推广可能不是你想要的结果。
这一点可以参照C语言的宏,对于宏写成的比较函数来说,任何两个东西比较都是合乎语法的,但结果可能不正确,甚至编译器不会给你任何有用的提示。C++模板就是要避免这种情况发生,使程序员减少了编码工作量的同时,又提供机制限制编译器制造出预期之外的错误。
模板具体化之后与普通函数在执行效率方面是不会有任何区别,因为对于编译器来说,模板具体化之后就是普通函数。 模版特化和偏特化一般用于模版元编程,运行时的没什么用
页:
[1]