模板滥用?

Template abuse?

本文关键字:      更新时间:2023-10-16

我想将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)对于程序员来说都是冗长和笨拙的。

在可能的情况下,最好避免使用它们。 虽然所有_cast运算符都有自己的位置(即在某些情况下,它们确实是问题的最佳解决方案),但它们也是钝器,可用于解决由于设计不良而导致的问题。 不幸的是,如果可以选择,许多程序员会使用这种钝器,而不是花更多的精力来学习适当的技术,并清理他们的设计 - 这有好处,例如使代码更容易正常工作,更容易维护。

dynamic_cast可以说是_cast运算符中最糟糕的,因为它几乎总是在运行时引入开销。 如果它用于解决由于设计不佳而导致的缺陷,则会有明显的运行时损失。

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

你所要求的是一种让程序员轻松使用dynamic_cast的方法,而且不需要思考。 这将鼓励糟糕的设计,允许程序员轻松地使用_cast运算符来解决设计问题,而他们通常最好先付出更多的努力来避免需要这种转换。 有很多关于可用于避免使用dynamic_cast等操作的技术的信息。

所以,是的,如果你真的需要使用这样的转换,我建议你坚持使用dynamic_cast.

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

相关文章:
  • 没有找到相关文章