当谈到属性列表时,我指的是存储类的附加信息的通用列表。
最简单的情况:
一个班级有std::map<std::string, std::string>
。第一个字符串命名属性(如"Color"
),第二个字符串描述值(如"Yellow"
)。
在此示例中,使用这些属性的另一个类需要检查映射中是否存在某个属性名称,然后解析该值。
然而,在谈论绩效时,这不是最好的概念。
您如何实现这样的属性列表?
是否有任何类似的设计模式或库?
我对C ++特别感兴趣 - 这样做的方式,但如果有独立于语言的解决方案,请发布它们。
如果某个类需要具有动态属性且用户不想为每个属性继承,则可以使用属性列表。
如果这有帮助,您可以查看我与该主题相关的其他问题:
Attributelists or inheritance jungle?
编辑:
当然我忘记了一些信息(感谢评论):
属性可以应用于对象。同一类的对象可能有不同的属性。对象具有的属性可以更改(值可以更改,可以添加/删除属性)
希望这有点清楚。
答案 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函数 可以使用任何类型的值调用 满足一些要求。 在内部,动态属性映射 转换键和值对以满足 潜在的要求 属性映射或表示运行时 如果不能,则例外。