代码之家  ›  专栏  ›  技术社区  ›  Chris Bednarski

缓存设计:基于不可变键的可变实体对象的flyweight

  •  0
  • Chris Bednarski  · 技术社区  · 15 年前

    我的应用程序中有很多不同的屏幕一遍又一遍地引用相同的实体/业务对象。
    当前,每个屏幕都引用各自的每个对象的副本。
    此外,实体对象本身可能会公开对其他实体对象的访问,同样会创建对象的新副本。
    我正试图找到一个缓存解决方案。

    我在找类似于Boost::Flyweight的东西。
    但是,基于不可变键/可变值和计数的引用。

    boost::flyweight<key_value<long, SomeObject>, tag<SomeObject> > object;
    

    以上几乎是完美的。 我在找一个类似的容器,它可以对某个对象进行可变访问

    编辑: 我喜欢flyweight的语法和语义。然而,flyweight只允许 常量对象& 访问,没有机会修改对象。

    edit2:代码必须在msvc++6上编译

    有什么想法吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   p00ya    15 年前

    只要你快乐地影响内在状态,那么从内在的 boost/flyweight/key_value.hpp 看起来你可以通过 const_cast .如果您有自己的密钥提取器,您应该确保它不会随 x 易变将使其暴露于。

    flyweight<key_value<long, SomeObject> > kvfw(2);
    SomeObject &x = const_cast<SomeObject &>(static_cast<const SomeObject&>(kvfw));
    
        2
  •  0
  •   Vijay Mathew Chor-ming Lung    15 年前

    我认为,如果你使飞锤可变,那么它们就不能被合法地称为飞锤。想象一种情况,字形表示为飞锤。如果一个函数改变了表示字母“a”的标志符号的码位,会发生什么?另一个在屏幕上呈现字形的函数将尝试绘制“a”,用户可能最终会看到“b”或其他东西!我认为您需要引用可变对象的不可变键。然后,考虑使用 hash table 加上一些参考计数机制。