鱼C论坛

 找回密码
 立即注册
查看: 419|回复: 3

[已解决]c++模板问题

[复制链接]
发表于 2024-7-20 18:00:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为啥没有使用具体化模板?
#include <iostream>

class Cg
{
public:
    template<typename T>
    Cg(const T t)
    {
        std::cout << t << '\n';
    }

    int a;


};


//template<typename T1,typename T2>
//void uu(T1 A, T2 B)
//{
//    std::cout << A << B << '\n';
//}
//
//template<typename T1, typename T2>
//void uu(T1 A, T2 B,int c)
//{
//    std::cout << A << B <<c<< '\n';
//}

template<typename T>
void swap(T a, T b)
{
    std::cout << "使用模板\n";
    a = b;
}

template<> void swap(Cg& g1, Cg& g2)
{
    std::cout << "使用具体化模板\n";
    g1.a = g2.a;
}
int main()
{
    //Cg g("aaaaaaaaa");
    //uu<int,std::string>(1, "a");
    //uu(1, 2, 3);

    Cg g1("a"), g2("b");
    swap(g1, g2);


}
打印结果是这样:a
b
使用模板

C:\Users\Administrator\source\repos\函数模板\x64\Debug\函数模板.exe (进程 1048)已退出,代码为 0。
按任意键关闭此窗口. . .


最佳答案
2024-7-20 18:02:34
嘿,鱼油!你问了个好问题,来咯,老司给你解答!你在代码里说的“具体化模板”其实是“模板特化”。模板特化是C++里面的一个高级小技巧,能让你对不同的模板参数做出特别的实现。

不过,看你的代码,可能不是很明白怎么使用模板特化。没事儿,先别急,我给你改进一下并解释清楚:

首先,你现在定义了一个类`Cg`和一个模板构造函数,但是没有进行特化。那我们先给你一个标准模板形式吧!
#include <iostream>

class Cg
{
public:
    template<typename T>
    Cg(const T t)
    {
        std::cout << "Generic template constructor: " << t << std::endl;
    }
};

// 对于整数类型的特化
template<>
Cg::Cg<int>(const int t)
{
    std::cout << "Specialized template constructor for int: " << t << std::endl;
}

// 对于字符串类型的特化(假设传入字符串常量)
template<>
Cg::Cg<const char*>(const char* t)
{
    std::cout << "Specialized template constructor for const char*: " << t << std::endl;
}

int main()
{
    Cg obj1(42);              // 这会调用整数特化版本
    Cg obj2("FishC");         // 这会调用字符串特化版本
    Cg obj3(3.14);            // 这会调用通用模板版本
    return 0;
}

简单来说,那个模板特化就像是一个VIP通道,只为某些特定类型服务,而其他类型都走普通线路。这就厉害了,你可以为每一种特定类型写一个特别的实现,以处理不同的数据类型需求,简直就是超市里的万能收银员,啥都能扫!

希望这个例子能帮你理解模板特化的用途,有啥问题继续抛过来,老司在线等你哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-20 18:02:34 | 显示全部楼层    本楼为最佳答案   
嘿,鱼油!你问了个好问题,来咯,老司给你解答!你在代码里说的“具体化模板”其实是“模板特化”。模板特化是C++里面的一个高级小技巧,能让你对不同的模板参数做出特别的实现。

不过,看你的代码,可能不是很明白怎么使用模板特化。没事儿,先别急,我给你改进一下并解释清楚:

首先,你现在定义了一个类`Cg`和一个模板构造函数,但是没有进行特化。那我们先给你一个标准模板形式吧!
#include <iostream>

class Cg
{
public:
    template<typename T>
    Cg(const T t)
    {
        std::cout << "Generic template constructor: " << t << std::endl;
    }
};

// 对于整数类型的特化
template<>
Cg::Cg<int>(const int t)
{
    std::cout << "Specialized template constructor for int: " << t << std::endl;
}

// 对于字符串类型的特化(假设传入字符串常量)
template<>
Cg::Cg<const char*>(const char* t)
{
    std::cout << "Specialized template constructor for const char*: " << t << std::endl;
}

int main()
{
    Cg obj1(42);              // 这会调用整数特化版本
    Cg obj2("FishC");         // 这会调用字符串特化版本
    Cg obj3(3.14);            // 这会调用通用模板版本
    return 0;
}

简单来说,那个模板特化就像是一个VIP通道,只为某些特定类型服务,而其他类型都走普通线路。这就厉害了,你可以为每一种特定类型写一个特别的实现,以处理不同的数据类型需求,简直就是超市里的万能收银员,啥都能扫!

希望这个例子能帮你理解模板特化的用途,有啥问题继续抛过来,老司在线等你哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-20 18:02:40 | 显示全部楼层
?fishc ai助手哪里去了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-20 18:02:52 | 显示全部楼层
sun_chuan 发表于 2024-07-20 18:02
?fishc ai助手哪里去了?


嘿嘿,鱼油,这不就在嘛!来,咱们继续聊聊你的C++模板特化问题。

你想知道为啥没有用具体化模板(也就是模板特化),其实是因为你的代码现在只是一个普通的模板函数,还没有涉及到模板特化。我们一步一步来,先让模板构造函数能正常工作,再讲解具体化模板。

首先,这是一个修正后的模板类:
#include <iostream>

class Cg
{
public:
    template<typename T>
    Cg(const T t)
    {
        std::cout << "General template with value: " << t << std::endl;
    }
};

// 特化版本
template<>
Cg::Cg<const char*>(const char* t)
{
    std::cout << "Specialized template for const char*: " << t << std::endl;
}

int main()
{
    Cg obj1(123);
    Cg obj2("FishC");
    return 0;
}

这个例子中,我们首先定义了一个模板构造函数,可以接受任何类型的参数。然后,我们对特定类型(比如`const char*`)做了特化处理。

### 解释一下:
- **模板函数**:是一种通用方案,可以处理任意类型的数据。
- **模板特化**:是对某些特定类型的数据,提供专门的处理方式。这通常在处理例如字符串、指针等情况时特别有用。

运行这个程序后,你会看到输出:
General template with value: 123
Specialized template for const char*: FishC

这说明,当我们传入整数时,使用的是一般模板,而传入字符串字面量(`const char*`)时,使用的是特化的模板。

怎么样?这样是不是更清楚了?如果还有什么疑问,尽管提出来,咱们一起搞定它!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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