强制const-version优先级
force preference of const-version?
假设我有
class A {
double a;
double Value() const {
return a;
}
double& Value() {
return a;
}
}
//later:
A foo;
double b = foo.Value();
现在,将调用非const版本。是否有一种很好的方法来强制使用const版本?我觉得用演员也可以,但我觉得不太优雅。
您可以将其强制转换为const
double b = static_cast<const A&>(foo).Value();
(我不认为我曾经显式地将const
添加到变量中。我不确定static_cast
是否比const_cast
更合适。
比强制转换更漂亮一点——赋值给const引用不需要显式强制转换:
A foo;
const auto& cfoo = foo;
double b = cfoo.Value(); // will use Value()const
在实践中,如果你在所有的函数参数中尽可能地使用const
,那么你很可能会在某个时候将foo
传递给bar(const A& x)
。
您可以使用代理完成您想要的:
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
,但不需要修改使用它的代码。但是,它会将读取和写入成员数据的代码分开,因此您可以分别在每个代码上设置断点。
你不能做得很优雅,但最简单的是do define
class A {
...
const A * operator->() const
{
return this;
}
}
并使用
foo->Value();
不是foo.Value();
为const-version-only 从c++ 17开始,我们有std::as_const()
为您将引用强制转换为const引用。例如:
#include <utility>
...
A foo;
double b = std::as_const(foo).value();