代码之家  ›  专栏  ›  技术社区  ›  MOnsDaR

如何实现属性列表?[关闭]

  •  1
  • MOnsDaR  · 技术社区  · 15 年前

    在谈到属性列表时,我指的是存储类附加信息的通用列表。

    最简单的情况是:
    一个类有一个 std::map<std::string, std::string> . 第一个字符串命名属性(如 "Color" ,第二个字符串描述值(如 "Yellow" )
    在本例中,使用这些属性的另一个类需要检查映射中是否存在某个属性名,然后分析该值。
    然而,在谈论性能时,这并不是最好的概念。

    如何实现这样的属性列表?
    有没有什么设计模式或库可以这样做?

    我特别感兴趣的是C++的方式,但如果有语言无关的解决方案,请张贴它们。

    在类需要具有动态属性且用户不希望为每个属性继承的情况下,可以使用属性列表。
    如果这有帮助,您可以查看我关于该主题的其他问题:
    Attributelists or inheritance jungle?

    编辑:
    当然,我忘了一些信息(感谢评论):
    属性可以应用于对象。同一类的对象可能有不同的属性。对象可以更改的属性(值可以更改,可以添加/删除属性)
    希望这能清楚一点。

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

    我也做了类似的事情。

    如果属性对于类的所有实例都是通用的,那么对描述属性的类进行单独的元描述。然后,每个实例提供一个简单的Boost::Any类型的向量(我不使用Boost::Any,而是使用我们自己编写的类似的东西)。

    如果每个实例的属性可以不同,那么为每个实例创建一个映射,其中键是一个原子,值是boost::any(或类似的值)。在窗口下,原子是一种字符串的数值表示。首先使用字符串指示“属性名”,然后将其转换为原子,并将其用作映射中的键。使用数字原子而不是字符串将加快在映射中查找属性的速度(前提是您将原子值保留在某个位置,并且不需要每次需要属性值时都执行字符串到原子的查找)。

    不要将属性用作存储类数据成员的常规方法。如果这样做,调试将成为一场噩梦,因为很难看到类中的实际值是什么。同时也不可能设置监视点。

    仅使用这些属性来存储不能放入普通数据成员中的内容,例如: -您事先不知道这些属性(例如,它们可能是特定于客户的) -您不想在两个类之间引入依赖项(甚至按名称)。

        2
  •  1
  •   Steve Townsend    15 年前

    看一看 dynamic property maps 在Boost属性图中。

    动态属性映射 满足对接口的需求 检查为的属性映射 延迟到运行时。几个组成部分 结合提供动态支撑 属性映射。动态特性 类收集一组异源 从 Boost属性映射库。各 属性映射被分配为 添加到时基于字符串的键 集合,它可以是 用那个键寻址。内部, 动态属性适应每个 包含属性映射 动态属性映射接口,其中 提供get和put函数 可以使用任何类型的值调用 满足一些要求。 在内部,动态属性映射 将键和值对转换为满足 基础的要求 属性映射或向运行时发出信号 如果不能,则例外。

    推荐文章