我的应用程序中的许多不同屏幕一遍又一遍地引用相同的实体/业务对象 目前,每个屏幕都指自己的每个对象的副本 此外,实体对象本身可以公开对其他实体对象的访问,同样会创建新的对象副本 我正在尝试找到一个缓存解决方案。
我正在寻找类似于boost :: flyweight的东西 但是,基于不可变键/可变值和引用计数。
boost::flyweight<key_value<long, SomeObject>, tag<SomeObject> > object;
以上几乎是完美的。 我正在寻找一个类似的容器,它将提供对SomeObject的可变访问
编辑: 我喜欢flyweight的语法和语义。但是,flyweight只允许 const SomeObject&amp; 访问,没有机会修改对象。
Edit2:代码必须在MSVC ++ 6上编译
有什么想法吗?
答案 0 :(得分:1)
只要你很高兴影响内在状态,那么从boost/flyweight/key_value.hpp中的内部看起来你可以使用const_cast
。如果你有自己的密钥提取器,你应该确保它不会因使x
mutable暴露给它的操作而变化。
flyweight<key_value<long, SomeObject> > kvfw(2);
SomeObject &x = const_cast<SomeObject &>(static_cast<const SomeObject&>(kvfw));
答案 1 :(得分:0)
我认为如果你使飞镖变得可变,那么它们就不能合法地称为飞重。想象一下,字形被表示为flyweights。如果一个函数更改代表字母“A”的字形的代码点,会发生什么?在屏幕上渲染字形的另一个功能是尝试绘制'A',用户可能最终会看到'B'或其他东西!我认为你需要引用可变对象的不可变键。然后,考虑使用hash table和一些引用计数机制。