我一直在阅读和研究,不同的帖子,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){}
我错过了什么?我真的很感激一些见解,而且我确实理解功能模板专业化在实践中并不是那么有用,但我仍然想要理解为什么它首先被发明。无论谁想出它,都必须有一个当时看起来足够引人注目的理由。
感谢。
答案 0 :(得分:1)
好问题!功能模板专业化有点利基,一般不值得。你可能会对原因感到有点困惑。
你问“没有类型参数的滑稽模板语法是什么?”充分利用!专业化模板非常重要且有用,好的旧swap
示例是考虑它的经典理由。模板体现了适用于任何类型的通用算法的想法,但通常如果您对类型有所了解,可以使用更好的算法,而不需要调用代码需要知道在引擎盖下发生了任何不同的事情。只有编译器知道并且它在使用特定类型实例化算法时为实际类型提供最佳实现,因此快速swap
在没有需要特殊情况的排序算法的情况下发生。专业化是使通用编程在现实世界中有用的关键部分(或者我们必须使用非通用版本来获得我们所需的性能)。
功能模板专业化虽然有点利基,但原因更为模糊。我猜你看过Herb Sutter's summary了?所以,如果你不想被抓住,最好避免专门化功能模板。 (std::swap
是一个例子,虽然你拥有来专门化而不是超载,如果你想要超出标准。我们在这里的代码库中广泛地做到这一点并且运行良好实际上,虽然重载也可能运行得很好。)
所以,请专注于你喜欢的一切。拥有类模板专业化,远非“荒谬”通常是至关重要的,但功能模板专业化并不那么有用。