我想通过说它与范式相关而开始这个问题,我只想澄清一些概念.所以我已经用Python编程了大约两年了,把我的脚趾浸入Java但不是太多,我想深入研究C++.我之前使用过它,但不适用于涉及大量设计的大型项目.
当我第一次开始探索它时,我相信它与Java类似地解决了OOP,其中所有东西都必须实现一个接口.然后我碰到了模板的概念,我立即将其作为一种解决方法,为原型(整数,浮点数)提供多态性行为,而这些原语并没有实现它(基本上是Python通过鸭子输入而没有形式接口).但我很快发现模板用于为非原始类型提供相同的行为.
所以我的问题是:在模板中使用经典多态性的原因是什么,在C++社区中这是什么一般方法?
编辑刚刚发现这几乎解决了这个问题(静态多态性确实需要围绕这个术语).
冒着进行全面概括的风险,模板主要用于Java中的泛型 - 它们允许您构建可用于许多不同数据类型的类或函数.拿std::list
,标准模板库的一部分.您可以使用std::list<int>
的对象或对象列表创建整数的链接列表std::list<MyClass>
.另一个例子是std::thread
,它使用模板来获取函数(或lambda或functor),并使用其参数在另一个线程中运行.
至于在函数f(SomeInterface x)
和函数模板之间进行选择f(T x)
,它实际上取决于上下文并且在某种程度上是主观的.需要考虑的一些事项是:
函数模板和类模板在编译时解析,因此您可以获得更好的性能.然而,
历史上,C++编译器为模板错误生成几乎无法解读的垃圾.Clang做了一些工作来改进这一点,其他编译器正在努力匹配Clang.事情变得越来越好,但它仍然非常难看.
不要害怕在接口和实现类中使用传统的多态性.虽然在某些情况下std::thread
使用模板而不是多态(参见使用模板的C++ 和Thread
使用Runnable
接口的Java ),但多态在C++库和项目中仍然非常常见.
简而言之,您可以考虑使用模板,但不要将它们视为多态性的替代品.看看一个流行的C++库,你一定会发现很多多态性.以OGRE为例,这是一款流行的C++图形引擎.如果你查看它的类列表,你会发现许多接口(例如WindowEventListener
和FrameListener
),用户可以从中派生一个类,以便与库进行交互.
归档时间: |
|
查看次数: |
6254 次 |
最近记录: |