【问题标题】:Trigger cast operator on use of the dot operator在使用点运算符时触发强制转换运算符
【发布时间】:2012-08-03 16:19:32
【问题描述】:

我有一个类似这样的课程:

template<typename T>
class wrapper
{
public:
    operator const T & () const
    {
        return value;
    }
private:
    T value;
};

然后我将它与这样的结构一起使用:

struct point { float x; float y; };

//...

wrapper<point> myPoint;
std::cout << myPoint.x;// error: no member x or whatever.

我想知道是否有办法允许这样做而不必执行 ((point)myPoint).x。我知道我可以重载 -> 运算符,但我不想这样做,因为它应该“假装”为非指针。

【问题讨论】:

  • 你可以说static_cast&lt;point const &amp;&gt;(myPoint).x
  • 如果长度是您想要避免的,您可以将转换运算符更改为operator() 并使用myPoint().x;。不过,它的意义不如operator-&gt;

标签: c++ casting implicit-conversion


【解决方案1】:

您可以使用-&gt; 而不是. 实现类似的目标:

template<typename T>
class wrapper
{
public:
    operator const T & () const // will this still be needed now?
    {
        return value;
    }

    T* operator->() { return &value; }
    T const* operator->() const { return &value; }

private:
    T value;
};

然后:

struct point { float x; float y; }

//...

wrapper<point> myPoint; // this needs to be initialised!
std::cout << myPoint->x;

【讨论】:

  • @Mr.Anubis 哦,是的,你是对的。这是直接从问题中复制的。
  • 这很好,但是拥有一个 .GetValue() 运算符不是更有意义吗?
  • @JohanLundberg 我怎么知道哪个更有意义?我不知道wrapper 应该是什么。
  • @JohanLundberg:问题是你不能用. 做到这一点。在这些备选方案中,operator-&gt; 可能是最有意义的一个。
【解决方案2】:

你不能像你描述的那样让你的包装类伪装成一个真正的类。主要原因是成员选择(.)运算符不能重载。

【讨论】:

  • 有点惊讶这没有投票。它很简短,但答案很简单……目前。对operator. isocpp.org/blog/2016/02/… 的持续推动以及处理. 的显式访问,建议劫持未在类中定义的所有 访问(例如operator=)并转发那些对于operator. 的结果,我担心这个隐含的角色似乎过于宽泛、有风险、超出其名称的范围,并且懒惰:如果你想转发运营商,请写下它们……但 Bjarne 是提案的作者之一,所以!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多