4

我有两个具有以下结构的类:

struct A {
  A transform() const;
};

struct B {
  // returns a temporary A
  A operator*() const;
};

操作符在*这里可能看起来有点奇怪,但考虑到它的使用上下文实际上是很自然的。事实上,B真正的存在只是为嵌入式语言提供一些语法糖,因此它的方法和运算符旨在为代码提供所需的外观。给定B b,获得关联A的速度很快,*b。我有时想A立即调用转换。目前,这需要一些额外的括号(*b).transform()。似乎有一个自然的简化,即b->transform(). 但是operator ->应该返回一个指针并且operator *返回一个临时的。我怎样才能实现这样的重载?

4

1 回答 1

5

免责声明:对于因从内置操作符更改重载操作符的值类别而引起的任何混淆,我概不负责。

struct just_some_type
{
    int m;

    int transform() { return m; }
};

// the intermediate helper stops the recurring application of ->
// if the lhs of -> is of a class type
struct intermediate_helper
{
    just_some_type member;

    just_some_type* operator->() { return &member; }
};

struct ptr_like
{
    just_some_type operator*()
    { return {42}; }

    intermediate_helper operator->()
    { return {{42}}; }
};

使用示例:

#include <iostream>

int main()
{
    auto p = ptr_like{};
    std::cout << (*p).transform() << "\n";
    std::cout << p->transform() << "\n";
}

重要说明:作用于的对象p->是左值,因为内置->应用于指针!例如,如果你有transform一个 lvalue-ref like 的资格int transform() &;,那么这个版本(*p).transform()将无法编译,但p->transform()仍然是合法的。

于 2014-02-25T23:35:02.963 回答