模板滥用?

时间:2018-04-12 07:47:57

标签: c++ templates dynamic-cast

我想将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吗?

1 个答案:

答案 0 :(得分:2)

如果您阅读了参与C ++设计的一些专家的材料(Stroustrup,Sutter,列表继续),您会发现dynamic_cast(以及所有_cast s)对于程序员BY DESIGN来说,这是冗长而笨拙的。

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

可以说,{p> dynamic_cast_cast运算符中最差的运算符,因为它几乎总是在运行时引入开销。如果它被用于解决由于设计不良而导致的缺陷,则会有明显的运行时间损失。

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

您要求的是一种允许程序员轻松使用dynamic_cast并且思路较少的方法。这将鼓励糟糕的设计,允许程序员轻松使用_cast运算符解决设计问题,而他们通常会更好地应用更多的努力来避免首先需要这样的转换。有大量有关可用于避免使用dynamic_cast等操作的技术的信息。

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

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