吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 865|回复: 3
收起左侧

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

[复制链接]
dong555 发表于 2023-1-23 22:19
本帖最后由 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)一样,具体有什么区别呢。

[C++] 纯文本查看 复制代码
#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结构重载一个==的运算符。

补充代码:

[C++] 纯文本查看 复制代码
#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++模板就是要避免这种情况发生,使程序员减少了编码工作量的同时,又提供机制限制编译器制造出预期之外的错误。

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

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
dong555 + 1 + 1 热心回复!

查看全部评分

fenginsc 发表于 2023-1-24 06:53
模版特化和偏特化一般用于模版元编程,运行时的没什么用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 01:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表