C++部分模板专门化语法
对于主模板:
template<typename A, typename B> class MyClass {...
之间有什么区别
template<typename A, typename B> class MyClass<int, float> {...
对于模板专业化,和
template<> class MyClass<int, float> {...
for primary template:
template<typename A, typename B> class MyClass {...
with template specialization, what is the difference between
template<typename A, typename B> class MyClass<int, float> {...
and
template<> class MyClass<int, float> {...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
模板<类型名称 A,类型名称 B>类 MyClass不允许使用 {...
。事实上,如果您指定形式参数A
和B
,您的模板应该使用它们。第二种情况很正常:你说你正在进行专门化,没有“自由”参数。
中间情况可能
再次有效:这里您仅修复第二个模板参数。
部分特化的思想如下:创建一个带有一些形式参数的模板,并使用它们来表达对初始模板参数的约束。部分特化的参数不需要与初始模板参数相同。示例:
对于您的案例来说,这是一个有效的部分专业化。这可以理解为“对于任意类型
X
、Y
和Z
,如果MyClass
的模板参数匹配X*
和Y(Z&)
,使用此专业化”。编译器应该非常聪明才能匹配类型模式。template<typename A, typename B> class MyClass<int, float> {...
should be not allowed. Indeed, if you specify the formal parametersA
andB
, your template should be using them.The second case is just normal: you say that you are making specialization with no "free" parameters.
An intermediate case could be
which is again valid: here you are fixing only the 2nd template parameter.
The idea of a partial specialization is following: you make a template with some formal parameters, and use them to express the constraints on the parameters of initial template. The partial specialization's parameters don't need to be the same as the initial template parameters. Example:
would be a valid partial specialization for your case. This can be read as "for arbitrary types
X
,Y
andZ
, ifMyClass
's template parameters matchX*
andY(Z&)
, use this specialization". Compiler should be quite clever in order to match the type pattern.