是否调用const或non-const成员完全由调用它的对象的constance决定,而不是由某些后续操作决定。这个决定是在考虑您调用的特定方法之前做出的。
DataComponent
. 您仍然可以使用围绕数据组件的代理对象来更不直接地破坏所需的功能,这两者都有
const
非
康斯特
转发
getCaption()
S.
编辑:根据要求的细节(在我的头上)。你需要提前申报一些东西——我没费心,因为这会让你更加困惑。处理任何问题/反馈。请注意,这基本上假定您出于某种原因不能/不想修改组件,但它不是一个通用的模板化解决方案,它可以简单地包装在任意类型上—它是非常重耦合的,并且具有很高的维护负担。
// know they can't call a non-const operation on T, so this is ok...
const T* Component::operator->() const { return instance; }
// they might invoke a non-const operation on T, so...
DataComponent::Proxy Component::operator->() { return DataComponent.getProxy(*this); }
在里面
class DataComponent
:
struct Proxy
{
Component& c_;
DataComponent& d_;
Proxy(Component& c, DataComponent& d) : c_(c), d_(d) { }
const std::string& get_caption() const { return d_.get_caption(); }
void set_caption(const std::string& s)
{
c_.on_pre_mutator(d_);
d_.set_caption(s);
c_.on_post_mutator(d_);
}
};
然后
DataComponent::Proxy DataComponent::getProxy(Component& c) { return Proxy(c, *this); }
所以,这意味着你必须在某个地方传递代码转发功能。这是一种痛苦,但如果您这样做是为了调试或测试,这并不不合理。如果您这样做是为了添加一个锁或其他东西,那么可能有更好的选择。