我想将 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++ 设计的专家(Stroustrup、Sutter,等等)的资料,您会发现 dynamic_cast
(以及所有的 _cast
s) 对程序员来说是冗长和笨拙的设计。
在所有可能的情况下,最好避免使用它们。虽然所有的 _cast
运算符都有它们的位置(即在某些情况下它们确实是问题的最佳解决方案),但它们也是钝器,可用于解决由于不良设计引起的问题.不幸的是,如果有选择的话,很多程序员会选择这种生硬的工具,而不是付出更多的努力来学习适当的技术,并清理他们的设计——这有一些好处,比如让代码更容易正确工作,以及更易于维护。
dynamic_cast
可以说是 _cast
运算符中最糟糕的,因为它几乎总是会在运行时引入开销。如果它用于解决由于不良设计导致的缺陷,则会有明显的运行时损失。
使语法笨拙和冗长会鼓励程序员寻找替代方案(例如,设计类型和对类型的操作,以避免此类转换的需要)。
您所要求的是一种允许程序员轻松使用 dynamic_cast
且思考较少的方法。这将鼓励糟糕的设计,允许程序员轻松使用 _cast
运算符来解决设计问题,而他们通常最好付出更多的努力来避免在第一名。关于可用于避免使用 dynamic_cast
等操作的技术,有大量可用信息。
所以,是的,如果你真的需要使用这样的转换,我建议你坚持使用 dynamic_cast
。
更好的是,您可能还想努力学习设计技术和习语,以减少您需要使用它的频率。
关于c++ - 模板滥用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49790804/