你将如何实现属性列表?

时间:2010-10-19 06:33:50

标签: c++ design-patterns class-design

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

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

您如何实现这样的属性列表?
是否有任何类似的设计模式或库?

我对C ++特别感兴趣 - 这样做的方式,但如果有独立于语言的解决方案,请发布它们。

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

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

2 个答案:

答案 0 :(得分:2)

我做了类似的事情。

如果属性对于您的类的所有实例都是通用的,请为您的类创建单独的Meta描述,您可以在其中描述属性。然后,每个实例提供一个类型为boost :: any的简单向量(我不使用boost :: any但我们自己编写的类似的东西)。

如果每个实例的属性可以不同,则为每个实例创建一个映射,其中键是一个原子,值为boost :: any(或类似的东西)。在Windows下,原子是一种字符串的数字表示。首先使用字符串来表示“属性名称”,然后将其转换为原子并将其用作地图中的键。使用数字原子而不是字符串将加速地图中属性的查找(假设您将原子值保留在某处,并且每次需要属性值时都不需要执行字符串到原子的查找)。 / p>

不要将属性用作存储类数据成员的常规方法。如果你这样做,调试将成为一场噩梦,因为很难看出你班级的实际价值是多少。同时放置观察点也是不可能的。

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

答案 1 :(得分:1)

在Boost Property Map中查看dynamic property maps

  

具体的动态属性映射   解决了对接口的需求   检查的属性映射   延迟到运行时间。几个组件   结合起来为动态提供支持   物业地图。 dynamic_properties   班级收集一组异质的   从中模拟概念的对象   提升物业地图库。每   属性映射分配了一个   添加到基于字符串的键   集合,它可以   使用该密钥解决。在内部,   dynamic_properties适应每个   包含属性映射   动态属性映射接口,其中   提供get和put函数   可以使用任何类型的值调用   满足一些要求。   在内部,动态属性映射   转换键和值对以满足   潜在的要求   属性映射或表示运行时   如果不能,则例外。