c++ - 显式函数模板特化 - 为什么?

标签 c++ template-specialization

我一直在阅读和研究不同的帖子、C++ 书籍、文章,但到目前为止还没有人向我解释过这种结构的合理性。这毫无意义,而且真的很烦我。模板的全部意义在于将类型参数化为函数(或类,但我说的是函数模板,而不是类)。为什么要使用没有类型参数的有趣模板语法???

//this seems ridiculous. why would anybody ever use this?
template<> void Swap(int & a , int & b){}
//I would always use this if I needed to take care of a special case, no?
void Swap(int & a , int & b){}

我错过了什么?我真的很感激一些见解,而且我确实明白函数模板特化在实践中并不是那么有用,但我仍然想了解为什么首先要发明它。想出它的人一定有当时看来足够令人信服的理由。

谢谢。

最佳答案

好问题!函数模板特化有点小众,通常不值得。不过,您可能对原因有点困惑。

你问“没有类型参数的有趣模板语法是什么?”大量使用!专门化模板非常重要和有用,旧的 swap 示例是考虑它的经典理由。模板体现了适用于任何类型的通用算法的思想,但通常如果您对类型有所了解,就可以引入更好的算法,而无需调用代码来了解幕后发生的任何不同。只有编译器知道,它会在使用特定类型实例化算法时为实际类型引入最佳实现,因此您的快速 swap 发生时不需要特殊情况的排序算法。特化是使泛型编程在现实世界中有用的关键部分(否则我们必须使用非泛型版本来获得我们需要的性能)。

函数模板 特化虽然有点小众,但原因不明。我猜你已经读过 Herb Sutter's summary ?所以,如果你不想被发现,最好避免特化函数模板。 (std::swap 是一个示例,尽管如果您想 super 符合标准,您可以专门化而不是重载。我们在我们的这里的代码库,它在实践中运行良好,尽管重载可能也能很好地工作。)

所以,请专攻你喜欢的一切。拥有类模板特化,远离“荒谬”通常是至关重要的,但函数模板特化并不是那么有用。

关于c++ - 显式函数模板特化 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22082429/

相关文章:

继承语句中的 C++ 部分特化?

c++ - 仿函数基类的模糊重载

c++ - 使用指针或引用时的模板特化优先级

java - 安卓 JNI : Java calling a C++ class object via JNI

c++ - Boost文档声明

c++ - MFC Native Appli 中的正则表达式支持

java - 如何以编程方式捕获 Oracle Virtualbox 计算机屏幕?

c++ - std::remove_reference 解释了吗?

c++ - 如何正确设计和实现函数模板特化?

C++ - 继承虚函数实现