让我们考虑以下代码:
template<typename T>
void func(T);
template<typename T>
void func(T*); // an overload
我知道第二个声明是重载,而不是部分专业化:
template<typename T>
void func<T*>(T*); // not allowed by C++ standard
但是我不知道它与部分专业化有何不同?它为我们提供了与部分专业化所提供的功能相同的功能,不是吗?
答案 0 :(得分:1)
但是我想知道它与部分专业化有何不同?
不同之处在于它不是专业。模板专业化是主要模板的替代实现,在提供某些模板参数时使用。当您将一组参数应用于代码中的模板名称时,这将导致编译器调用模板实例化机制。其中一部分是检查主模板的显式专业化,并在它们与那些参数匹配时使用它们。
函数重载不会发生。而是使用了过载解析机。
不同的方式可以达到相同的目的。
如果您需要详细信息,则功能不只是名称;它是一个名称及其签名。因此,具有相同名称但签名不同的功能就是不同的功能。因此,该行未声明相同模板函数的专业化;它声明了一个新的主模板。
它为我们提供了与部分专业化相同的功能,不是吗?
在某些情况下,部分专业化可以比重载更方便地完成某些工作,但这些情况可能基于SFINAE或其他元编程技巧。是的,部分专业化可以完成重载的大部分工作。
但是,无论函数局部专门化是否存在,您仍然需要重载规则。对于非模板情况以及可以用非模板版本重载模板函数的情况,您需要这些规则。或者具有比主模板更多或更少的参数。您需要能够拥有一些构造器,它们是模板,而有些则不是。
因此,无论如何,都有关于模板函数如何重载的规则。
因此,更好地表达您的意思是,函数重载很大程度上会使函数部分专业化多余(这可能就是为什么它不存在的原因)。甚至更好的是,类模板的部分专业化是一种为类模板提供类似于函数的重载功能的方法。