【问题标题】:Get the address of an object that has overloaded operator&获取具有重载 operator& 的对象的地址
【发布时间】:2012-03-02 15:40:05
【问题描述】:

CComPtroperator& 被重载,这使得我通常编写的代码崩溃。

我想知道是否有任何方法可以强制变量返回其对象的地址?

【问题讨论】:

  • 你可能想改写一下。
  • 我从未使用过 COM,但有没有没有重载运算符的 CComPtr 基类?您可以将CComPtr 转换为此类,获取地址并将其转换回。或者,如果你真的想把事情搞砸,你可以做一个&reinterpret_cast<int>(theCComPtr)。但我不建议这样做。
  • @Mike Seymour 提供了一个答案,后来由于我的评论而被删除。看了boost::addressof的实现,相信他的回答是正确的,不应该被去掉,应该接受。
  • @LuchianGrigore 好了,完成了。我有点书呆子,我很抱歉:)

标签: c++ com generic-programming


【解决方案1】:

解决办法太可怕了:

reinterpret_cast<CComPtr*>(&reinterpret_cast<char&>(ptr))

【讨论】:

  • 问题是它是泛型代码,所以它需要适用于任何类型。
  • 我不是 Windows 开发人员,但这似乎很危险。例如,如果ptr 指的是完整对象的子对象,或者如果CComPtr 是完整类型的虚拟基础,我可以看到这以可怕的方式破坏......
  • @xcrypt: 推测该类型是可用的(作为模板参数或其他) - 将其替换为 CComPtr
【解决方案2】:

如果可以使用 boost,请考虑使用:addressof,如果不能,请查看实现。

【讨论】:

    【解决方案3】:

    您可以将CComPtr 转换为CComPtrBase,从我从 MSDN 页面收集到的信息来看,它没有重载运算符。它可能看起来像这样:

    CComPtr* addr=dynamic_cast<CComPtr*>(&((CComPtrBase)theCComPtr));
    

    我不知道这是否可行(我无法尝试),但似乎可行,如果可行,它会比 reinterpret_cast 解决方案好一点。

    【讨论】:

    • 转换为CComPtrBase 将调用复制构造函数。可能不是你想要的。此外,您不能将 &amp; 运算符应用于右值,因此它甚至不应该编译。
    • 啊。哎呀。我从来没有使用过 COM,所以我在这里学习一些有限的 C++ 知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多