让我说我有
class A {
double a;
double Value() const {
return a;
}
double& Value() {
return a;
}
}
//later:
A foo;
double b = foo.Value();
现在,将调用非const版本。 有没有一种很好的方法来强制使用const版本?我认为这可能是演员,但我认为它不是很优雅。
答案 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();