对象或其重载运算符能否知道它是否正在调用 `const` 方法?

问题描述 投票:0回答:1
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
来调用此额外代码。

c++ templates c++17 operator-overloading const-method
1个回答
0
投票

正如 @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();
};

第二个示例也可以与第一个示例结合使用,以强制使用给定的访问函数进行常量/非常量访问。

© www.soinside.com 2019 - 2024. All rights reserved.