前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于函数模板的一些不为人知的用法

关于函数模板的一些不为人知的用法

作者头像
用户11173787
发布2024-10-07 07:53:45
60
发布2024-10-07 07:53:45
举报
文章被收录于专栏:破晓

引言

关于函数模板,大家都不陌生。但是如下的函数模板,大家肯定没有见过

没有提供任何特例化的模板

不管我们传入的是什么类型的参数,都可以匹配到这个模板【所以又被称为万能模板】

代码语言:javascript
复制
template<class T>
class Vector
{
public:
	Vector()
	{
		cout << "Vector init" << endl;
	}
};

部分特例化模板

假如我们知道传入的参数类型一定是指针类型,我们可以这样设计模板:

代码语言:javascript
复制
template<class T>
class Vector<T*>
{
public:
	Vector()
	{
		cout << "Vector<T*> init" << endl;
	}
};

完全特例化模板

如果想针对某一特定类型的参数【比如int类型】定制一个模板,我们可以:

代码语言:javascript
复制
template<>
class Vector<char*>
{
public:
	Vector()
	{
		cout << "Vector<char*> init" << endl;
	}
};

一些特殊的特例化

如上的几种特例化,大家指定都用过,但是接下来几种特例化的方式,大家肯定不太了解

针对函数指针的部分特例化模板
代码语言:javascript
复制
//这个函数指针类型部分特例化  有返回值  有两个参数的(指针)
template<class R,class A1,class A2>
class Vector<R(*)(A1,A2)>
{
public:
	Vector()
	{
		cout << "Vector<R(*)(A1,A2)> init" << endl;
	}
};
int main()
{
	Vector<int(*)(int, int)>();
}
针对函数的部分特例化模板
代码语言:javascript
复制
template<class R,class A1,class A2>
class Vector<R(A1,A2)>
{
public:
	Vector()
	{
		cout << "Vector<R(A1,A2)> init" << endl;
	}
};
int main()
{
	Vector<int(int, int)>();
}

总结

  • 特例化是针对普适化而言的,在针对不同的类型做出特例化的模板之前,必须存在没有任何特例化「适用于任何的类型」的模板
  • 不同模板的匹配规则是:先看有没有针对这一类型的完全特例化模板,再看有没有针对这一类型的部分特例化模板,如果这两种都不存在的情况下,再寻找适用于任何类型的模板。遵循从特殊到一般的匹配规则
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 没有提供任何特例化的模板
  • 部分特例化模板
  • 完全特例化模板
  • 一些特殊的特例化
    • 针对函数指针的部分特例化模板
      • 针对函数的部分特例化模板
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档