我想将dynamic_casts从基类转换为派生自此样式:

auto derived = dynamic_cast<Derived*>(object);

为了更紧凑。为此,我在Base类中添加了以下模板:
template<typename T>
T As() { return dynamic_cast<T>(this); }

所以现在前面的语句将被重写为
auto derived = object->As<Derived*>();

我更喜欢这种风格。但是我知道可能存在可读性问题(主观)或该类的内存使用情况吗?如果我是正确的,这将为每种类型的派生对象生成一个函数。此数字可能很大(100个不同的派生类)。

我应该坚持简单的dynamic_cast吗?

最佳答案

如果您从许多参与C++设计的专家那里读到的 Material (Stroustrup,Sutter, list 不胜枚举),您会发现dynamic_cast(以及所有_cast)对于程序员BY DESIGN而言是冗长而笨拙的。

在所有可能的情况下,最好避免使用它们。尽管所有_cast运算符都有其应有的地位(即在某些情况下,它们确实是对问题的最佳解决方案),但它们也是钝器,可用于因设计不良而解决问题。不幸的是,如果有选择的话,很多程序员会选择这种钝器,而不是花更多的精力来学习适当的技术并清理他们的设计-这有使代码更容易正确工作的好处,以及易于维护。
dynamic_cast可以说是_cast运算符中最差的,因为它几乎总是在运行时引入开销。如果使用它来解决由于不良设计而引起的缺陷,则会有明显的运行时间损失。

使语法笨拙和冗长会鼓励程序员寻找替代方法(例如,设计类型和对类型的操作,从而避免了此类转换的需要)。

您所要求的是一种允许程序员轻松而少加思考地使用dynamic_cast的方法。通过允许程序员轻松地使用_cast运算符来解决设计问题,这将鼓励不良的设计,而通常情况下,他们通常会花更多的精力来避免首先进行此类转换,而这会更好。关于技术的大量信息可用于避免使用诸如dynamic_cast之类的操作。

因此,是的,如果您确实需要使用此类转换,建议您坚持使用dynamic_cast

更好的是,您可能还需要努力学习设计技术和成语,以减少使用频率。

10-08 08:28
查看更多