阅读this question使我感到奇怪:是否存在禁止类模板重载的技术原因?

通过重载,我的意思是拥有多个具有相同名称但参数不同的模板,例如

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)包含以下引用:



此外, C++的设计和演变(Amazon)包含在15.10.3节中的引用。



大胆强调我的。我的解释是,函数重载解析比类专门化更难实现(并由用户正确使用)。因此,可能没有真正的技术障碍(类似于功能模板部分特化),而是历史性的事故。

09-10 05:22
查看更多