C++ 模板(泛型编程)与多态性?

标签 c++ oop templates

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

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

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

编辑 刚刚找到this这几乎回答了这个问题(静态多态性我真的需要围绕这个术语来思考)。

最佳答案

冒着一概而论的风险,模板在大多数情况下的使用类似于 Java 中的泛型 - 它们允许您构建可用于许多不同数据类型的类或函数。取std::list ,标准模板库的一部分。您可以使用 std::list<int> 创建一个整数链表,或带有 std::list<MyClass> 的对象列表.另一个例子是 std::thread ,它使用模板获取函数(或 lambda 或仿函数)及其参数以在另一个线程中运行。

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

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

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

  • 不要害怕对接口(interface)和实现类使用传统的多态性。虽然在某些情况下使用模板代替多态(参见 C++ 的 std::thread 使用模板与 Java 的 Thread 使用 Runnable 接口(interface)),多态在 C++ 库和项目中仍然非常普遍。

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

关于C++ 模板(泛型编程)与多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457530/

相关文章:

php - 在 Woocommerce "New account"电子邮件通知模板中获取用户电子邮件

c++ - 错误 C2440 : '=' : cannot convert from 'int' to 'char [5]'

用于分布式计算的 C++ 与 C

java - 使用双重否定来测试条件

java - Android 轻量级 HTML 模板引擎

C++ 模板运算符重载不同类型,自动返回类型

c++ - QSerialPort readLine() 与 readAll() 相比非常慢

c++ - AIX 中的编程内存监视

c++ - TwoDimensionalShape 类应该包含什么?

javascript - 使 JavaScript 方法等待构造函数完成