admin管理员组文章数量:1487745
关于函数模板的一些不为人知的用法
引言
关于函数模板
,大家都不陌生。但是如下的函数模板,大家肯定没有见过
没有提供任何特例化的模板
不管我们传入的是什么类型的参数,都可以匹配到这个模板【所以又被称为万能模板】
代码语言:javascript代码运行次数:0运行复制template<class T>
class Vector
{
public:
Vector()
{
cout << "Vector init" << endl;
}
};
部分特例化模板
假如我们知道传入的参数类型一定是指针类型,我们可以这样设计模板:
代码语言:javascript代码运行次数:0运行复制template<class T>
class Vector<T*>
{
public:
Vector()
{
cout << "Vector<T*> init" << endl;
}
};
完全特例化模板
如果想针对某一特定类型的参数【比如int类型】定制一个模板,我们可以:
代码语言:javascript代码运行次数:0运行复制template<>
class Vector<char*>
{
public:
Vector()
{
cout << "Vector<char*> init" << endl;
}
};
一些特殊的特例化
如上的几种特例化,大家指定都用过,但是接下来几种特例化的方式,大家肯定不太了解
针对函数指针的部分特例化模板
代码语言:javascript代码运行次数:0运行复制//这个函数指针类型部分特例化 有返回值 有两个参数的(指针)
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代码运行次数:0运行复制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)>();
}
总结
- 特例化是针对普适化而言的,在针对不同的类型做出特例化的模板之前,必须存在没有任何特例化「适用于任何的类型」的模板
- 不同模板的匹配规则是:先看有没有针对这一类型的完全特例化模板,再看有没有针对这一类型的部分特例化模板,如果这两种都不存在的情况下,再寻找适用于任何类型的模板。
遵循从特殊到一般的匹配规则
本文标签: 关于函数模板的一些不为人知的用法
版权声明:本文标题:关于函数模板的一些不为人知的用法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/shuma/1755014294a3182480.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论