我有两个类,其结构如下:
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 *是返回一个临时的。我如何实现这样的过载?
发布于 2014-02-25 23:35:02
免责声明:我不负责任何混乱,因为改变的价值类别的重载运算符与他们的内置对应。
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->中操作的对象是一个lvalue,因为内置的->应用于指针!例如,如果将transform限定为lvalue-ref (如int transform() &; ),那么(*p).transform()版本将无法编译,但p->transform()仍然是合法的。
https://stackoverflow.com/questions/22028313
复制相似问题