假设我有
class A {
double a;
double Value() const {
return a;
}
double& Value() {
return a;
}
}
//later:
A foo;
double b = foo.Value();
现在,将调用非常量版本。有没有强制使用 const 版本的好方法?我认为有演员表是可能的,但我认为它不是很优雅。
假设我有
class A {
double a;
double Value() const {
return a;
}
double& Value() {
return a;
}
}
//later:
A foo;
double b = foo.Value();
现在,将调用非常量版本。有没有强制使用 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
,但不需要对使用它的代码进行修改。但是,它会将读取和写入成员数据的代码分开,因此您可以分别在每个代码上设置断点。
你不能做得那么优雅,但最不冗长的就是定义
class A {
...
const A * operator->() const
{
return this;
}
}
并使用它
foo->Value();
代替
foo.Value();
仅用于 const 版本
从 C++17 开始,我们std::as_const()
为您转换了对 const 引用的引用。例如:
#include <utility>
...
A foo;
double b = std::as_const(foo).value();