c++ 一个对象或它的重载操作符能知道它是否在调用一个`const`方法吗?

sg2wtvxw  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(87)
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以调用此额外代码。

b4qexyjb

b4qexyjb1#

正如@Mat评论的那样,没有办法仅根据返回类型隐式地选择正确的重载。你必须以某种方式告诉编译器在调用点使用哪个函数,要么在const或非const对象上调用它,要么使用单独的函数。
如果要强制使用给定函数来访问const/non-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();
};


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

相关问题