【问题标题】:If an operator is overloaded for a C++ class how could I use a default operator instead?如果 C++ 类的运算符重载,我该如何使用默认运算符?
【发布时间】:2010-11-11 16:08:24
【问题描述】:

_com_ptr_ 有一个带有副作用的重载 operator&()。如果我有一个变量:

_com_ptr_t<Interface> variable;

如何在不调用重载运算符并触发副作用的情况下检索其地址(_com_ptr_t* 指针)?

【问题讨论】:

  • 您想要_com_ptr_t&lt;Interface&gt;* 还是Interface*

标签: c++ operator-overloading


【解决方案1】:

&variable.GetInterfacePtr();

【讨论】:

  • 这会检索存储在智能指针中的指针的地址。但是,我认为问题是关于如何获取智能指针的地址。
【解决方案2】:

我在 ISO 会议上看到了这个案例,因为它破坏了一些 offsetof() 宏实现 (LWG 273)。解决办法:&amp;reinterpret_cast&lt;unsigned char&amp;&gt;(variable)

【讨论】:

  • 在某些令人惊讶的情况下这会咬我吗?
  • 使用 boost::address_of。它基于本文中提供的实现。我认为它将成为即将发布的标准的一部分。
  • @sharptooth:可能不会。该解决方案具有相当合理的行为。获取 unsigned char 左值的地址是完美定义的,即使转换的对象定义了 operator unsigned char 本身,reinterpret_cast 到 unsigned char& 也应该可以工作。
【解决方案3】:

我定义了这个效用函数:

template<typename T>
T *GetRealAddr(T &t)
    { return reinterpret_cast<T*>(&reinterpret_cast<unsigned char &>(t)); }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2019-02-09
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多