4

假设我有

class A {
  double a;
  double Value() const {
    return a;
  }

  double& Value() {
    return a;
  }

}

//later:
A foo;
double b = foo.Value();

现在,将调用非常量版本。有没有强制使用 const 版本的好方法?我认为有演员表是可能的,但我认为它不是很优雅。

4

5 回答 5

6

您可以将其转换为const.

double b = static_cast<const A&>(foo).Value();

(我认为我从未明确添加const到变量中。我不确定是否static_cast比 更合适const_cast。)

于 2013-05-30T17:05:59.407 回答
3

比强制转换更漂亮——分配给 const 引用不需要显式强制转换:

A foo;
const auto& cfoo = foo;
double b = cfoo.Value(); // will use Value()const

在实践中,如果您const尽可能在所有函数参数中虔诚地使用,那么您很可能会在某个时候传递foo到。bar(const A& x)

于 2018-02-15T01:16:48.350 回答
2

您可以使用代理完成您似乎想要的事情:

class A {
  double a;

  class proxy { 
      A &a;
  public:
      proxy(A &a) : a(a) {}

      operator double() const { return a; }

      proxy operator=(double d) { a.a = d; return *this; }
  };

public:

  proxy Value() {
    return proxy(*this);
  }
}

// ...

double d = foo.Value();   // will use proxy::operator double.
foo.Value() = 1.0;        // will use proxy::operator=

这确实需要对您的 . 进行(内部)修改class A,但不需要对使用它的代码进行修改。但是,它会将读取和写入成员数据的代码分开,因此您可以分别在每个代码上设置断点。

于 2013-05-30T17:33:09.273 回答
1

你不能做得那么优雅,但最不冗长的就是定义

class A {
...

const A * operator->() const
{
   return this;
}

}

并使用它

foo->Value();

代替

foo.Value();

仅用于 const 版本

于 2013-05-30T17:09:33.530 回答
0

从 C++17 开始,我们std::as_const()为您转换了对 const 引用的引用。例如:

#include <utility>
...
A foo;
double b = std::as_const(foo).value();
于 2018-02-15T01:48:42.700 回答