模块属性名称 - 值对C ++ API框架 - 重新发明?

时间:2011-04-26 08:01:54

标签: c++ api properties settings boost-propertytree

我经常遇到API,允许用户获取和设置控制模块操作的各种参数。我现在发现自己正在考虑编写另一个属性API,但不想重新发明轮子。

以下是典型的基本客户端代码:

setInt("bitrate", 1000);
setEnum("mode", MODE_FAST);
setStr("output file", "music.mp3");

通常可以设置许多参数,并且这些属性集通常在不断发展中。

有些API比其他API更智能,更高级的功能是:

  • 属性的分层分组
  • 属性的枚举
  • 具有强制最小值和最大值的数字参数
  • 默认参数值
  • 启用,禁用或只读的设置
  • 动态参数 - 根据其他参数的状态显示,消失,设置最小/最大,启用,禁用或只读的设置。
  • 通过UUID密钥而非文本名称
  • 访问的属性

除了上面示例代码中的C风格访问器之外,我还遇到了以下框架:

  • 读取/写入文件属性(例如XML)
  • 对Windows注册表进行读/写设置
  • IPersistPropertyBag
  • 等系统属性API的接口
  • 具有默认的哑GUI实现,例如树视图或列表
  • 具有适合最小/最大/启用状态的GUI扩展,减少GUI代码中的重复。

我希望找到一个精心设计的公共图书馆,为上述所有内容提供框架,但到目前为止已经空白了。我知道Boost.PropertyTree但它只是一个骨架。我应该注意其他可移植属性API框架吗?

2 个答案:

答案 0 :(得分:2)

Qt属性系统的一个关键元素实际上是变体类型类QVariant的非常可靠的实现,使您可以删除键入的setIntsetString。 ..电话。

如果你掌握了类似表现良好的课程,例如:可能Boost::Variant或类似的属性系统使用字符串映射作为后备部分相当容易实现。

qt属性系统的一个便利是你可以覆盖setter和getter函数而无需用户知道它们。例如。鉴于您的通用属性设置器为setProperty(name, value)。实现者可以在类声明中表示属性“speed”具有自己的setter setSpeed(float value),这样当您的类的用户调用setProperty("speed", 100)的通用版本时,系统将调用setSpeed(100)在你的实例上。

如果您不需要这样的功能,您可以实现自己的属性系统。 Gamasutra有一篇关于实施reflection in C++的文章也可能对你有帮助。

答案 1 :(得分:0)

如果你不介意依赖Qt Core,那么Qt的设计相当好property system。这意味着你将依赖于Qt的MOC