c++ - 模板滥用?

标签 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 吗?

最佳答案

如果您阅读许多参与 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/

相关文章:

C++:模板参数循环依赖

具有模板化类型结构问题的 C++ 函数模板参数

c++ - 符合标准的编译器可以拒绝包含来自非多态类型的 dynamic_cast downcast 的代码吗?

c++ - 需要一个 constexpr 来使 for 循环中的值加倍

c++ - 如何使用dynamic_cast

c++ - 不能向侧面动态施放

c++ - 根据编译时常量,使用 #define'd 或 typedef'ed 相同的标识符是否被认为是可接受的做法?

c++ - 需要 C++ 语法的初学者帮助

c++ - 使用命名空间头文件c++

c++ - 为什么我们不能直接使用类模板来推导方法模板?新加坡金融学会