问题标签 [static-cast]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - static_cast<> 和 C 风格转换有什么区别?
有什么理由static_cast<>
比 C 风格的铸造更喜欢吗?它们是等价的吗?有什么速度差异吗?
c++ - static_cast 安全性
AFAIK,对于指针/引用 static_cast,如果此时编译器看不到类定义,则static_cast
其行为类似于reinterpret_cast
.
为什么static_cast
指针/引用不安全而数值安全?
c++ - C++:不能 static_cast 从 double* 到 int*
当我尝试使用 static_cast 将 double* 转换为 int* 时,出现以下错误:
这是代码:
我知道在 double 和 int 之间转换会出现问题,但为什么在 double* 和 int* 之间转换会出现问题?
c++ - 从基类指针 C++ 访问子类成员
我有一组自定义类学生对象。CourseStudent 和 ResearchStudent 都继承自 Student,Student 的所有实例都是其中之一。
我有一个函数来遍历数组,确定每个学生的子类型,然后在它们上调用特定于子类型的成员函数。
问题是,因为这些函数没有重载,所以在Student中是找不到的,所以编译器就大惊小怪了。
如果我有一个指向 Student 的指针,有没有办法获得指向该 Student 子类型的指针?我需要在这里做一些假演员来解决编译时错误吗?
c++ - C++ 标准中的哪些措辞允许 static_cast(malloc(N)); 去工作?
据我了解 5.2.9 静态转换中的措辞,唯一一次void*
允许对象指针转换void*
的结果是首先是逆转换的结果。
在整个标准中,有一堆对指针表示的引用,指针的表示与void
指针的表示相同char
,依此类推,但似乎从未明确地说强制转换任意void
指针会产生指针到内存中的同一位置,具有不同的类型,很像类型双关是未定义的,其中不双关回到对象的实际类型。
因此,虽然malloc
清楚地返回了合适内存的地址等,但据我所见,似乎没有任何方法可以实际使用它,可移植。
c++ - 我避免 dynamic_cast<> 的方法是否比 dynamic_cast<> 本身更快?
几分钟前我正在回答一个问题,它向我提出了另一个问题:
在我的一个项目中,我做了一些网络消息解析。消息的形式为:
有效载荷的格式和内容由消息类型决定。我有一个基于公共类的类层次结构Message
。
为了实例化我的消息,我有一个静态解析方法,它Message*
根据消息类型返回 a 字节。就像是:
我有时需要访问子类的方法。因为我的网络消息处理必须很快,所以我决定避免dynamic_cast<>
并且我在基Message
类中添加了一个方法来返回消息类型。根据这个返回值,我使用 astatic_cast<>
来代替正确的子类型。
我这样做主要是因为有人告诉我这样做dynamic_cast<>
很慢。但是,我不知道它到底做了什么以及它有多慢,因此,我的方法可能同样慢(或更慢)但要复杂得多。
大家觉得这个设计怎么样?这很常见吗?它真的比使用更快dynamic_cast<>
吗?欢迎对一次使用时引擎盖下发生的事情进行任何详细解释dynamic_cast<>
!
- - 编辑 - -
既然有人问为什么:
基本上,当我收到一个帧时,我会做两件事:
- 我解析消息并构建
Message
框架内容是否有效的子类的相应实例。除了解析部分没有逻辑。 - 我收到 a
Message
并根据 aswitch(message->getType())
,我static_cast<>
选择正确的类型并执行任何必须对消息执行的操作。
c++ - 奇怪的 static_cast 技巧?
在阅读 Qt 源代码时,我遇到了这个 gem:
注意static_cast<T>(0)->Type
? 我已经使用 C++ 很多年了,但之前从未见过 0 在 static_cast 中使用过。这段代码在做什么,它安全吗?
背景:如果您从中派生,QGraphicsItem
则意味着声明一个名为Type
that 的唯一枚举值并实现一个称为type
返回它的虚函数,例如:
然后你可以这样做:
这可能有助于解释 static_cast 试图做什么。
c++ - 如何在 C++ 中实现多个 COM 接口?
我正在尝试了解有关浏览器帮助程序对象的示例代码。
在内部,作者实现了一个暴露多个接口(IObjectWithSite、IDispatch)的类。
他的 QueryInterface 函数执行以下操作:
我了解到,从 C 的角度来看,接口指针只是指向 VTable 的指针。所以我认为这意味着 C++ 能够使用 static_cast 返回任何已实现接口的 VTable。
这是否意味着以这种方式构造的类在内存中有一堆 VTable(IObjectWithSite、IDispatch 等)?C++ 对不同接口上的名称冲突做了什么(它们每个都有一个 QueryInterface、AddRef 和 Release 函数),我可以为每个接口实现不同的方法吗?
c++ - 使用 C++ 样式转换从 Void* 转换为 TYPE*:static_cast 或 reinterpret_cast
因此,如果您从 Void* 转换为 Type* 或从 Type* 转换为 Void*,您应该使用:
或者
对我来说 static_cast 似乎更正确,但我已经看到两者都用于相同的目的。此外,转换的方向是否重要。即我是否仍应将 static_cast 用于:
我已经阅读了关于 C++ 风格转换的其他问题,但我仍然不确定这种情况的正确方法是什么(我认为它是 static_cast)
c++ - static_cast 可以将非空指针变成空指针吗?
我需要为回调函数编写代码(它将在 ATL 中调用,但这并不重要):
这里void*
保证是指向的指针CMyClass
,所以static_cast
是合法的。我担心的是代码必须尽可能可移植(至少到较新版本的 Visual C++)。因此,为了超级偏执,我也倾向于检查CMyClass*
指针 - 我的意思是如果它结果为空怎么办?
第二次检查是否合理?是否可以static_cast
将非空指针转换为空指针?