![]() |
1
23
你基本上是对的,动态多态性(继承、虚拟)通常是正确的选择,当类型应该允许在运行时更改时(例如在插件架构中)。如果类型只应在编译时更改,静态多态性(模板)是更好的选择。 模板唯一的潜在缺点是1)它们通常必须在头文件中定义(这意味着要包含更多的代码),这通常会导致编译速度变慢。 但从设计角度看,如果可能的话,我看不到使用模板的任何问题。
取决于什么是“标准C++风格”。C++标准库使用了所有的一部分。STL为所有内容使用模板,稍微旧一点的iostreams库使用继承和虚拟函数,当然,从C继承的库函数两者都不使用。 现在,模板是最流行的选择,但是我不得不说这是最“标准”的方法。 |
![]() |
2
10
经典面向对象多态性的特性:
按模板列出的编译时多态性的属性:
请注意,没有必要为任何一个做出决定。你可以自由地混合和混合它们(以及许多其他的习语和范例)。通常,这会导致非常令人印象深刻(和富有表现力)的代码。(例如,例如,类型擦除之类的东西)通过巧妙地混合范例来了解什么是可能的,你可能想浏览Alexandrescu的“现代C++设计”。 |
![]() |
3
8
这是一种虚假的反对。是的,继承和虚拟函数的主要用途是
但是许多“最酷”的现代C++库,如Boost DO,都使用运行时多态性,他们只是使用模板来使它更方便使用。
它们都是单个项目容器,具体类型在编译时未知(这在
|
![]() |
4
4
在我的工作中积累了一些经验之后,模板中有一些我不喜欢的东西: 有一些缺点使模板元编程无法成为可用语言:
尽管如此,我还是在基本的实用程序和库中成功地使用了它。用它编写高级功能或与硬件相关的东西,对我来说似乎并没有什么好处。 也就是说,我用模板搭建积木,但用经典的方式建造房子。 |
![]() |
5
0
在我看来,这是你最擅长的。如果你对OO有更多的经验,使用OO。如果你对仿制药有更多的经验,那就使用仿制药。 这两种技术都有一些等价的模式,这意味着你可以使用它们中的任何一种。例如,OO中的策略与泛型中的策略,或OO中的模板方法与泛型中常见的循环模板模式。 如果您计划重构已经工作但结构有点臭的生产代码。不要用它作为一个借口来使用一些新的设计技术,因为在一两年内,一旦你更好地理解了这种技术,你可能会后悔如何重构代码。当你学习技术时,很容易引入新的不灵活。其目的是改进现有代码的设计,如果你不擅长某项技术,你怎么知道你在改进设计,而不是在代码中构建一个巨大的阳具符号。 就我个人而言,我更擅长OO,并且倾向于喜欢它,因为我知道我可以制作出易于理解且大多数人都可以改变的干净设计。大多数通用代码i的正确目的是与其他通用代码接口,例如编写迭代器或算法的通用函数。 |
![]() |
6
0
我在我的大型代码库中都使用这两种代码。当类型在编译时已知时,我使用模板设计它;当它仅在运行时已知时,我使用虚拟函数。我发现虚拟函数更容易编程,以后更容易阅读,但是有时性能非常关键,而且模板化多态性(如果您真的可以称之为多态性)可以内联这一事实确实有帮助。 |
![]() |
TCD · 标准库非类型模板类是否显式实例化? 2 年前 |
![]() |
sovesti · 参数较少的模板函数中的演绎 2 年前 |
![]() |
KiraHoneybee · 具有构造函数参数的模板化类 2 年前 |
![]() |
Seymore Glass · 模板不工作的默认参数 2 年前 |
![]() |
Alexander Daum · 模板参数中对模板类型的引用 6 年前 |
![]() |
ledonter · 为什么注入的类名有时不被视为类模板中的模板名? 6 年前 |