Reading 这个问题 https://stackoverflow.com/q/11964089/20984让我想知道:是否存在禁止类模板重载的技术原因?
通过重载,我的意思是拥有多个具有相同名称但参数不同的模板,例如
template <typename T>
struct Foo {};
template <typename T1, typename T2>
struct Foo {};
template <unsigned int N>
struct Foo {};
编译器设法处理重载函数和函数模板,是否可以将相同的技术(例如名称修改)应用于类模板?
起初,我认为单独使用模板标识符时可能会导致一些歧义问题,但唯一可能发生的情况是将其作为模板模板参数传递时,因此可以使用参数的类型来选择适当的超载:
template <template <typename> class T>
void A {};
template <template <unsigned int> class T>
void B {};
A<Foo> a; // resolves to Foo<T>
B<Foo> b; // resolves to Foo<N>
您认为这样的功能有用吗?是否有一些“好的”(即技术)原因导致这在当前的 C++ 中不可能?
第 12.5 节来自模板完整指南 (Amazon https://rads.stackoverflow.com/amzn/click/com/0201734842) 包含此引用:
您可能很想知道为什么只有类模板可以部分特化。原因大多是历史原因。
可能可以为函数模板定义相同的机制(参见第 13 章)。
在某些方面
重载函数模板的效果是类似的,但也有一些细微的差别。这些差异是
主要与以下事实有关:主模板需要
遇到使用时查找。专业是
仅在事后考虑,以确定应实施哪种实施
用过的。
相比之下,所有重载的函数模板都必须带上
通过查找它们进入过载集,它们可能来自
不同的命名空间或类。这增加了以下可能性
无意中在某种程度上重载了模板名称。
相反,它
还可以想象允许某种形式的类模板重载。
这是一个例子:
// invalid overloading of class templates
template<typename T1, typename T2> class Pair;
template<int N1, int N2> class Pair;
然而,似乎没有迫切需要
这样的机制。
此外,C++的设计和演变 (Amazon https://rads.stackoverflow.com/amzn/click/com/0201543303) 在第 15.10.3 节中包含此引用
因此我得出的结论是,我们需要一个“专业化”的机制
模板。这可以通过接受一般重载来完成
或者通过一些更具体的机制。我选择了一个特定的机制
因为我认为我主要是在解决由以下原因引起的违规行为
C 中的不规则性以及因为总是重载的建议
引发抗议声浪。我试图保持谨慎并
保守的;我现在认为这是一个错误。专业化为
最初定义是一种受限且异常的重载形式
与该语言的其余部分不太相符。
大胆强调我的。我将此解释为函数重载解析比类专业化更难实现(并且由用户正确理解)。因此,可能没有真正的技术障碍(类似于函数模板部分专业化),而是历史事故。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)