问题标签 [reinterpret-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.
com - 通过预定义的 COM 接口传递自定义数据
我正在使用 3-rd 方 COM 服务。它从 .NET 程序集中暴露出来。这个服务提供了几个接口,实际上我可以在我的 C++ 应用程序中使用(使用早期绑定)。实际上我想知道是否可以通过使用这些接口传递自定义数据,即对我来说,这些接口提供的内容还不够,我想在那里添加一些额外的数据/方法(虽然接口不是我的,所以我不能更改)。如果可能,请提供建议,如果不是,可能有一些解决方法(示例将非常有帮助)?
我试图了解是否可以通过 3-rd 方 COM 服务将自定义数据从我的生产者传递给我的消费者。可能我需要创建自己的接口,其中包含我的方法并继承 3-rd 方 ISomething 并使用它?
下面是说明问题的代码。非常感谢您的帮助...
1)我用来将数据从生产者传递给消费者的类(通过第 3 方 COM 服务):
2)我的数据生产者填充数据并将其传递给第 3 方 COM 服务
3)我的数据消费者尝试获取已定义和未定义的数据,但仅成功获取已定义的数据,未定义包含垃圾
c++ - 用作对象的封装字符数组是否违反了严格的别名规则
下面的类是否打破了严格的别名规则:
我对标准的解读是它是不正确的,但我不确定(我的用法是拥有一个对象数组T
+这些对象的一些元数据,但是可以在不手动分配内存的情况下控制对象构造/解构)作为分配的对象被用作new
标准中放置的示例。
c++ - 只通过指针转换来制作可互换的类类型,而不必分配任何新对象?
更新:我很欣赏“不想要那个,想要这个”的建议。它们很有用,尤其是在激励场景的上下文中提供时。仍然......不管是好是坏,我都很好奇找到一个硬性的“是的,可以在 C++11 中合法地完成”与“不,不可能做那样的事情”。
我想将对象指针“别名”为另一种类型,其唯一目的是添加一些辅助方法。别名不能将数据成员添加到底层类(事实上,我越能防止这种情况发生越好!)所有别名都同样适用于这种类型的任何对象......如果类型系统可以提示哪个别名可能是最合适的。
不应该有关于在底层对象中编码的任何特定别名的信息。因此,我觉得你应该能够“欺骗”类型系统并让它成为一个注释......在编译时检查,但最终与运行时转换无关。这些方面的东西:
在后台,工厂方法实际上是创建一个NodeBase
类,然后使用类似reinterpret_cast
的方法将其返回为Node<AccessorFoo>*
.
避免这种情况的简单方法是使这些轻量级的类包装节点并按值传递。因此,您不需要强制转换,只需将节点句柄包装在其构造函数中的 Accessor 类:
但如果我不必为此付出一切,我就不想。这将涉及 - 例如 - 为每种包装的指针(AccessorFooShared、AccessorFooUnique、AccessorFooWeak 等)创建一个特殊的访问器类型。将这些类型化的指针作为一个基于单个指针的对象标识的别名是可取的,并提供了一个很好的正交性。
所以回到最初的问题:
似乎有一些方法可以做到这一点,这可能是丑陋的,但不会“打破规则”。根据ISO14882:2011(e) 5.2.10-7:
对象指针可以显式转换为不同类型的对象指针。70 当“指向 T1 的指针”类型的纯右值 v 转换为“指向 cv T2 的指针”类型时,结果为 static_cast(static_cast(v))如果 T1 和 T2 都是标准布局类型 (3.9) 并且 T2 的对齐要求不比 T1 更严格,或者任何一个类型都是无效的。将“指向 T1 的指针”类型的纯右值转换为“指向 T2 的指针”类型(其中 T1 和 T2 是对象类型,并且 T2 的对齐要求不比 T1 的对齐要求更严格)并返回其原始类型会产生原始类型指针值。未指定任何其他此类指针转换的结果。
深入研究“标准布局类”的定义,我们发现:
- 没有非标准布局类(或此类类型的数组)或引用类型的非静态数据成员,并且
- 没有虚函数 (10.3) 和虚基类 (10.1),并且
- 对所有非静态数据成员具有相同的访问控制(条款 11),并且
- 没有非标准布局基类,并且
- 要么在最派生类中没有非静态数据成员,并且最多有一个具有非静态数据成员的基类,要么没有具有非静态数据成员的基类,并且
- 没有与第一个非静态数据成员相同类型的基类。
听起来像使用这样的东西会使我的手有点束缚,而访问器或节点中没有虚拟方法。然而,C++11 显然必须std::is_standard_layout
保持检查。
这可以安全地完成吗?似乎在 gcc-4.7 中工作,但我想确定我没有调用未定义的行为。
c++ - const void * 比 void * 提供什么价值?
在 C++ 中,将 aconst void *
用于函数的参数类型是否有任何价值void *
?由于 avoid *
是不透明的,除了用户这样做之外,是否存在任何修改风险reinterpret_cast
,在这种情况下,他们也可以const_cast
在 a 上做同样的事情const void *
,因此人们真的会买任何东西吗?我问是因为我使用了一个用于共享指针的实用程序模板类,它提供了一个专门化void
以避免void &
问题,但没有提供专门化const void
,因此我想知道这只是一个疏忽还是永远不需要它?
c++ - 为什么我需要 reinterpret_cast 将 Fred ** const 转换为 void ** const?
我有一个指向 a 的指针的 const 指针,但Fred
我不明白为什么 astatic_cast
还不够。
请有人可以解释为什么reinterpret_cast
需要将指针转换为Fred*
指针,void*
但static_cast
将指针转换为指针就Fred
可以了void
。
c++ - Reinterpret_cast 与安置新
通过阅读这篇文章,很明显 C++ 中的放置消息用于在预分配的内存位置调用类构造函数。
在内存已经初始化的情况下,placement new 还是 reinterpret_cast 更合适?
例如,假设我从 TCP 套接字读取表示帧消息的原始字节流。我将此流放入帧同步并检索一个已知大小的缓冲区,该缓冲区代表我的类,我将其称为 Message。我知道有两种方法可以继续。
创建一个带有标志的构造函数,告诉类不要初始化。在传递“不初始化”标志的缓冲区上做一个新的放置。
/li>使用 reinterpret_cast
/li>
我相信这两者都会产生相同的结果。一个比另一个更正确、更面向对象、更安全、更易于阅读还是更好的风格?
c++ - %p 说明符是否仅适用于有效指针?
假设在我的平台上sizeof(int)==sizeof(void*)
,我有这个代码:
由于传递了一个不是有效指针的值来代替,这是否会成为未定义的行为%p
?
c++ - reinterpret_cast,转换为兄弟类
我只是想知道以下 C++ 代码是否可以保证工作:
当然,你会为什么我需要这个?因为我想替换这个:
具有更好的结构(通过性能,不检查类型安全两次):
提前致谢!
c++ - 为什么 C 风格的演员表可以工作,但 reinterpret_cast 不能?
所以我有一个两个字符数组
我想将 v[0] 的值显示为 0 到 255 之间的数字,但是
所以我尝试了
或者
这正是我想要的,但我根本不喜欢它。另外我根本不明白为什么这不起作用:
c++ - reinterpret_cast 和 null 成员变量
我正在使用这样的 reinterpret_cast :
在方法内部,我的大多数成员变量(所有句柄)都是空的。这可能是因为 reinterpret_cast 因为我知道它不能保证我使用相同的地址吗?就像 static_cast 一样。我知道我们应该在这种情况下使用 static_case,但是这个问题现在让我感兴趣了。