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`!!
}
字符串
正如代码中演示的那样,如果operator->
用于调用const_foo()
方法,我希望调用operator->
的const
版本。
我的目的是使这一点自动化。所以下面不是一个解决方案,我正在寻找:
const_cast<const Y&>(y)->const_foo(); // Don't want this explicit casting
型
有没有办法做到这一点?
使用template
s或更改X, Y
的主体或更改其对象的声明(例如Y y
)很好。只是,我不想在代码中的方法调用的地方使用显式转换。
目的:上面是一个非常简单的例子。如果选择了operator->() const
,那么我将在其中调用一些额外的代码/方法。对于X
的任何const
方法(如X::const_foo()
),最好调用Y::operator->() const
以调用此额外代码。
1条答案
按热度按时间b4qexyjb1#
正如@Mat评论的那样,没有办法仅根据返回类型隐式地选择正确的重载。你必须以某种方式告诉编译器在调用点使用哪个函数,要么在const或非const对象上调用它,要么使用单独的函数。
如果要强制使用给定函数来访问const/non-const函数,可能需要将其分为两种不同的返回类型
字符串
您可能还希望完全不重载,并为常量/非常量访问使用不同的名称,以避免
const_cast
ing型
第二示例也可以与第一示例结合使用,以强制使用给定的访问函数进行常量/非常量访问。