我有两个具有以下结构的类:
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 *
返回一个临时指针。我怎样才能实现这样的重载?
最佳答案
免责声明:对于因更改重载运算符的值类别而不是其内置运算符而引起的任何混淆,我概不负责。
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->
中作用的对象是左值,因为内置的 ->
应用于指针!例如。如果您使用像 int transform() &;
这样的左值引用来限定 transform
,那么版本 (*p).transform()
将编译失败,但是 p->transform()
仍然是合法的。
关于c++ - 重载 operator-> 当 operator* 临时返回时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22028313/