c – 变体模板,参数包及其在参数列表中的歧义

前端之家收集整理的这篇文章主要介绍了c – 变体模板,参数包及其在参数列表中的歧义前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在这个问题中,我将参考 my previous question.

在这个问题上,我发现以下内容无效:

template<typename T,typename... A,typename S>
class C { };

这是因为:

[It is not valid code] for class templates because their arguments must always be specified,which will always result in an ambiguity unless the parameter pack is at the end and slurps up any remaining template parameters.

当然,这是有道理的.

然后,作为替代方法,提出了以下涉及专业化的方法

template<typename F,typename S>
class C;

template<typename T,typename S>
class C<T(A...),S> { };

实际上,这似乎是有效的,所以感谢提出它的那个.

无论如何,我不明白为什么这是有效的代码,而前一个没有.
如果以前的解决方案同样含糊不清呢?编译器为什么和如何解决这种歧义?
根据以前的问题(见这个问题开始的链接),在我看来,仍然是可变的部分应该扼杀任何参数到最后,因此这个代码也不应该是有效的.
我当然错了,但我的推理究竟是怎么了?

解决方法

在类模板中,预期模板参数列表C a,b,c,d,e,f>需要匹配
template<typename T,typename S>

其中… A只是浮动在参数列表中.

但在专业化中,需要匹配的不是模板列表,而是模式:

C<T(A...),S>

这是容易的,因为A …被分隔.

因此,在模板专业化中,参数列表只是一个符号的清单,一些标量和一些参数包,将以模式显示.

原文链接:https://www.f2er.com/c/115100.html

猜你在找的C&C++相关文章