8

我想通过说它与范式相关并且我只是想澄清一些概念来开始这个问题。所以我已经用 Python 编程大约 2 年了,我的脚趾浸入 Java 但不是太多,我想深入研究 C++。我以前使用过它,但没有用于涉及大量设计的大型项目。

当我第一次开始探索它时,我相信它处理 OOP 的方式类似于 Java,其中一切都必须实现一个接口。然后我遇到了模板的概念,我立即认为这是一种解决方法,可以为没有实现它的基元( intsfloats )提供多态行为(基本上是 Python 通过鸭子类型和没有正式接口所做的)。但我很快发现模板被用来为非原始类型提供相同的行为。

所以我的问题是:有什么理由在模板上使用经典的多态性,C++ 社区对此的一般方法是什么?

编辑刚刚发现几乎回答了这个问题(静态多态性真的需要让我的头脑围绕这个术语)。

4

1 回答 1

8

冒着进行全面概括的风险,模板的使用大多类似于 Java 中的泛型——它们允许您构建可用于许多不同数据类型的类或函数。以std::list标准模板库的一部分为例。您可以用 制作一个整数链表std::list<int>,或者用 制作一个对象列表std::list<MyClass>。另一个例子是std::thread,它使用模板来获取一个函数(或 lambda 或 functor)及其参数以在另一个线程中运行。

至于函数f(SomeInterface x)和函数模板之间的选择f(T x),它确实取决于上下文并且有些主观。需要考虑的一些事项是:

  • 函数模板和类模板在编译时解析,因此您可以获得更好的性能。然而,

  • C++ 编译器历来会为模板错误生成难以辨认的垃圾。Clang 已经做了一些工作来改进这一点,并且其他编译器正在变得更好以匹配 Clang。情况正在好转,但仍然很丑陋。

  • 不要害怕将传统的多态性与接口和实现类一起使用。虽然在某些情况下使用模板而不是多态(参见使用模板的 C++与使用接口std::thread的 Java ),但多态在 C++ 库和项目中仍然非常普遍。ThreadRunnable

简而言之,请随意考虑使用模板,但不要将它们视为多态性的替代品。看看一个流行的 C++ 库,你一定会发现很多多态性。以流行的 C++ 图形引擎 OGRE 为例。如果您查看它的类列表,您会发现许多接口(例如WindowEventListenerFrameListener),用户可以从中派生一个类以便与库进行交互。

于 2012-11-19T16:28:48.480 回答