struct X
{
void foo () {}
void const_foo () const {}
};
struct Y
{
X x;
int i;
X* operator-> () { return &x; }
const X* operator-> () const { return &x; }
};
int main ()
{
Y y;
y->foo(); // invokes `Y::operator->`
y->const_foo(); // invokes `Y::operator->`; BUT I want `Y::operator-> const`!!
}
正如代码中的演示,如果用于调用
const
方法,我希望调用 operator->
的 const_foo()
版本。
我的目的是使其自动化。因此,下面不是解决方案,我正在寻找:
const_cast<const Y&>(y)->const_foo(); // Don't want this explicit casting
有什么办法可以实现这个目标吗?
使用
template
或更改 X, Y
的主体或更改其对象的声明(例如 Y y
)都可以。只是,我不想在方法调用的地方使用代码中的显式转换。
目的:上面是一个非常简单的例子。如果选择了
operator->() const
,那么我将在其中调用一些额外的代码/方法。对于调用 const
的任何 X
方法(例如 X::const_foo()
),最好调用 Y::operator->() const
来调用此额外代码。
正如 @Mat 评论的那样,没有办法仅根据返回类型隐式选择正确的重载。您必须以某种方式告诉编译器在调用点使用哪个函数,方法是在 const 或非常量对象上调用它,或者使用单独的函数。
如果您想强制使用给定函数来访问 const/非常量函数,您可能需要将其分成两种不同的返回类型
// Different return types with different interface for const/non-const overloads
struct X {
void foo();
};
struct ConstX {
void const_foo() const;
};
struct Y {
X* operator->();
const ConstX* operator->() const;
};
您可能还希望根本不重载,并对常量/非常量访问使用不同的名称,以避免
const_cast
ing
struct X {
void foo();
void const_foo();
};
struct Y {
X& x();
const X& cx();
};
第二个示例也可以与第一个示例结合使用,以强制使用给定的访问函数进行常量/非常量访问。