0

例如,C++ 中模板的概念是为了舒适,因为编译器会为您的类或函数生成一些额外的代码,不是吗?因此,我们可以通过做一些额外的(手动工作)来摆脱模板。

虚函数呢???

有没有两者不可替代的情况?

4

5 回答 5

3

是的,我们可以通过做更多的手动工作(编写编译器编写的代码,或用于void*删除类型细节)来摆脱模板。

是的,我们可以通过做更多的手动工作(使用 switch 语句,或存储您自己的 vtable 结构)来避免多态性。

有没有不可替代的例子?

模板和多态方法为您提供了类型安全和编译器强制行为(例如纯虚拟),这些行为无法用某些手动方法替代。例如,std::sort使用起来比qsortwhich 操作更安全void*。这些手动方法可能会导致大量代码必须没有错误并进行维护。所以这取决于你对“不可替代”的定义。无论有没有这些特性,这些语言仍然是图灵完备的。理论上,你可以用图灵完备的语言计算任何东西,所以理论上我们可以用 BrainF*ck 替换所有语言……我们只是选择不这样做;)

于 2010-05-28T13:41:30.547 回答
2

不太一样。

模板在编译时有效地生成具有各种签名的函数。您可以很容易地复制粘贴或代码自己生成所有等效方法。

虚拟方法用于在运行时做出决策,因此虽然它们确实使程序员的工作更容易,但它们更难被替换。您不能只是复制粘贴代码来模拟虚函数,而是您必须自己实现几乎相同的东西,使用类似于 vtable 的函数指针表或其他一些替代方法。

简而言之,虚函数使一些原本很难做的事情变得更容易,但它是一组不同于模板影响的事情。

于 2010-05-28T14:08:17.060 回答
1

当然; 在多态性出现之前,甚至现在在不了解多态性的人的代码中,Giant Switch 语句取代了它。

于 2010-05-28T13:29:23.510 回答
0

我发现可以使用多态性来达到与模板相同的目的。但是,它确实像您怀疑的那样需要更多的工作。还有其他权衡需要考虑,包括性能和可维护性。当我决定走哪条路时,这些就会发挥作用。

于 2010-05-28T13:22:58.587 回答
0

我怀疑你可以用 AND 和 NOT 操作做所有你需要做的事情。其他的都是肉汁。

于 2010-06-01T23:45:19.263 回答