鱼C论坛

 找回密码
 立即注册
查看: 530|回复: 10

[已解决]template<class> 作用

[复制链接]
发表于 2020-7-14 20:11:32 | 显示全部楼层 |阅读模式

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

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

x
最近看了一下 STL,在 vector 里发现了 template<class> 这样一条语句,请问有什么作用呢?

这句代码在 链接: https://pan.baidu.com/s/1i5_LIhC4H_OplQPZFHsu7g 提取码: 9kfc 的 414 行。
最佳答案
2020-7-15 12:22:57
永恒的蓝色梦想 发表于 2020-7-15 12:12
额,这里是 Visual Studio 2019 的 vector 。

不过你的回答也解决了我的一些疑问。还是很感谢!

我查了一下,这好像是C++14中引入的变量模板
我也不是很懂,但我写了这样一段代码:
  1. #include <cstdio>
  2. #include <Windows.h>
  3. using namespace std;

  4. template<class> int var;

  5. int main()
  6. {
  7.         var<int> = 3;
  8.         var<double> = 4.5;
  9.         printf("%d\n", var<int>); // 输出:3
  10.         printf("%f\n", var<double>); // 输出:4.5

  11.         system("pause");
  12.         return 0;
  13. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-15 11:27:27 | 显示全部楼层
举个例子
  1. #include <cstdio>
  2. #include <Windows.h>

  3. // template函数
  4. template<class T>
  5. T add(T a, T b)
  6. {
  7.         return (T)(a + b);
  8. }

  9. // template类
  10. template<class Type>
  11. class Data
  12. {
  13. public:
  14.         Data(Type d)
  15.         {
  16.                 data = d;
  17.         }
  18.         Type GetData()
  19.         {
  20.                 return data;
  21.         }
  22. private:
  23.         Type data;
  24. };

  25. int main()
  26. {
  27.         int n = add<int>(2, 4); // 此时T相当于int
  28.         double f = add<double>(1.4, 3.5); // 此时T相当于double
  29.         printf("%d\n", n); // 输出:6
  30.         printf("%f\n", f); // 输出:4.9
  31.         // template还可以进行类型推断
  32.         n = add(2, 4); // 因为2和4都是int,所以编译器自动认为T就是int
  33.         printf("%d\n", n); // 输出:6

  34.         Data<int> nData(3);
  35.         printf("%d\n", nData.GetData()); // 输出:3
  36.         Data<double> fData(6.5);
  37.         printf("%f\n", fData.GetData()); // 输出:6.5

  38.         system("pause");
  39.         return 0;
  40. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 11:46:30 | 显示全部楼层

那是个空的模板……我是想知道空模板有什么作用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 12:02:24 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-7-15 11:46
那是个空的模板……我是想知道空模板有什么作用

举个例子:
  1. #include <cstdio>
  2. #include <string>
  3. #include <Windows.h>
  4. using namespace std;


  5. template<class T>
  6. T add(T a, T b)
  7. {
  8.         return (T)(a + b);
  9. }


  10. template<>
  11. string add(string a, string b) // string的add方法和其它add方法不一样
  12. {
  13.         string temp = a;
  14.         temp.append(b);
  15.         return temp;
  16. }

  17. int main()
  18. {
  19.         int n = add(1, 2);
  20.         string s1("he"), s2("ge");
  21.         string s = add(s1, s2);
  22.         printf("%s\n", s.c_str());

  23.         system("pause");
  24.         return 0;
  25. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 12:03:16 | 显示全部楼层
可以百度一下“模板专门化”是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 12:10:23 | 显示全部楼层
lhgzbxhz 发表于 2020-7-15 12:03
可以百度一下“模板专门化”是什么

谢谢您的回答。

源代码中是这样的:
  1.     template <class>
  2.     friend class _Vb_val;
  3.     friend _Tidy_guard<vector>;
复制代码
并没有模板函数,这有什么作用呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 12:10:58 | 显示全部楼层
emmm...刚刚看了看,刚刚说错了,抱歉
不过VC的vector里好像没有这行代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
永恒的蓝色梦想 + 5 + 5 + 5 感谢回答!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 12:12:18 | 显示全部楼层
lhgzbxhz 发表于 2020-7-15 12:10
emmm...刚刚看了看,刚刚说错了,抱歉
不过VC的vector里好像没有这行代码

额,这里是 Visual Studio 2019 的 vector 。

不过你的回答也解决了我的一些疑问。还是很感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 12:22:57 | 显示全部楼层    本楼为最佳答案   
永恒的蓝色梦想 发表于 2020-7-15 12:12
额,这里是 Visual Studio 2019 的 vector 。

不过你的回答也解决了我的一些疑问。还是很感谢!

我查了一下,这好像是C++14中引入的变量模板
我也不是很懂,但我写了这样一段代码:
  1. #include <cstdio>
  2. #include <Windows.h>
  3. using namespace std;

  4. template<class> int var;

  5. int main()
  6. {
  7.         var<int> = 3;
  8.         var<double> = 4.5;
  9.         printf("%d\n", var<int>); // 输出:3
  10.         printf("%f\n", var<double>); // 输出:4.5

  11.         system("pause");
  12.         return 0;
  13. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 12:29:23 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-7-15 12:12
额,这里是 Visual Studio 2019 的 vector 。

不过你的回答也解决了我的一些疑问。还是很感谢!

等等,这好像不是变量模板
  1. template<class T>
  2. class A
  3. {
  4. public:
  5.         A(T d)
  6.         {
  7.                 data = d;
  8.         }

  9. private:
  10.         T data;
  11. };

  12. template<class T>
  13. class B
  14. {
  15.         template<class> friend class A;
  16.         //... 其它函数
  17. };
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 12:30:33 | 显示全部楼层
这貌似只是friend class的声明,只是一个模板类声明而已

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +2 收起 理由
永恒的蓝色梦想 + 1 + 1 + 2 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 10:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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