const-version的强制偏好?

时间:2013-05-30 17:00:46

标签: c++

让我说我有

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

  double& Value() {
    return a;
  }

}

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

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

5 个答案:

答案 0 :(得分:6)

您可以将其投放到const

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

(我认为我没有明确地将const添加到变量中。我不确定static_cast是否比const_cast更合适。)< / em>的

答案 1 :(得分:3)

比铸造更漂亮 - 赋予const引用并不需要显式转换:

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

实际上,如果你在所有的函数参数中使用const,你可能会在某个时候将foo传递给bar(const A& x)

答案 2 :(得分: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,但不需要修改使用它的代码。但是,它会将读取代码与写入成员数据分开,因此您可以单独设置断点。

答案 3 :(得分:1)

你不能做那么优雅,但最不详的是定义

class A {
...

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

}

并使用它

foo->Value();

而不是

foo.Value();

for const-version-only

答案 4 :(得分:0)

从C ++ 17开始,我们有std::as_const(),它为你提供了对const引用的引用。例如:

#include <utility>
...
A foo;
double b = std::as_const(foo).value();