首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板滥用?

模板滥用?
EN

Stack Overflow用户
提问于 2018-04-12 15:47:57
回答 1查看 570关注 0票数 1

我想要将dynamic_casts从基类转换为从这种样式派生:

代码语言:javascript
复制
auto derived = dynamic_cast<Derived*>(object);

更紧凑的东西。为此,我在Base类中添加了以下模板:

代码语言:javascript
复制
template<typename T>
T As() { return dynamic_cast<T>(this); }

因此,现在前面的语句将被重写为

代码语言:javascript
复制
auto derived = object->As<Derived*>();

我更喜欢这种风格。但是我知道可能会有可读性问题(主观的)或者类的内存使用问题?如果我是正确的,这将为每种类型的派生I强制转换生成一个函数。这个数字可能很大(100个不同的派生类)。

我应该坚持使用普通的dynamic_cast吗?

EN

回答 1

Stack Overflow用户

发布于 2018-04-12 17:16:37

如果你阅读了许多参与C++设计的专家的资料(Stroustrup、Sutter等等),你会发现dynamic_cast (以及所有的_cast)在设计上对程序员来说是冗长和笨拙的。

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

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

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

您所要求的是一种让程序员能够更轻松、更省心地使用dynamic_cast的方法。这将鼓励糟糕的设计,因为它允许程序员轻松地使用_cast运算符来解决设计问题,而他们通常会更努力地避免首先需要这样的转换。有大量关于技术的信息可以用来避免使用像dynamic_cast这样的操作。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49790804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档