我想将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
。
更好的是,您可能还需要努力学习设计技术和成语,以减少使用频率。