我有两个具有以下结构的类:
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 *
返回临时值。我怎样才能实现这样的重载?
答案 0 :(得分:3)
免责声明:对于因重载运营商的价值类别从内置对应方改变而产生的任何混淆,我不承担任何责任。
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
等左值参考符合int transform() &;
,则版本(*p).transform()
将无法编译,但p->transform()
仍然合法。