C++ 模块属性名称-值对C++;API框架-改造?

C++ 模块属性名称-值对C++;API框架-改造?,c++,api,properties,settings,boost-propertytree,C++,Api,Properties,Settings,Boost Propertytree,我经常遇到API,它允许用户获取和设置控制模块操作的各种参数。我现在发现自己正在考虑编写另一个properties API,但不想重新发明轮子 以下是典型的基本客户端代码: setInt("bitrate", 1000); setEnum("mode", MODE_FAST); setStr("output file", "music.mp3"); 通常可以设置几十个参数,并且这些属性集通常正在不断开发中 某些API比其他API更智能,更高级的功能包括: 属性的分层分组 财产枚举 具有强制最

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

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

setInt("bitrate", 1000);
setEnum("mode", MODE_FAST);
setStr("output file", "music.mp3");
通常可以设置几十个参数,并且这些属性集通常正在不断开发中

某些API比其他API更智能,更高级的功能包括:

  • 属性的分层分组
  • 财产枚举
  • 具有强制最小值和最大值的数值参数
  • 默认参数值
  • 启用、禁用或只读的设置
  • 动态参数-根据其他参数的状态显示、消失、设置最小/最大值、启用、禁用或只读的设置
  • 通过UUID键而不是文本名称访问属性
除了上面示例代码中的C风格访问器之外,我还遇到了一些框架,它们可以:

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

我很想找到一个设计良好的公共图书馆,为上述所有内容提供一个框架,但到目前为止还没有找到。我知道,但这只是一个骨架。还有其他的可移植属性API框架我应该知道吗?

如果您不介意依赖Qt Core,那么Qt有一个相当好的设计。这意味着您将依赖Qt

Qt属性系统的关键元素之一实际上是变体类型类的一个非常可靠的实现
QVariant
,它使您能够摆脱类型化的
setInt
setString
。。。电话

如果您拥有一个类似的行为良好的类(例如,可能或类似的类),那么使用字符串映射作为支持部分,属性系统相当容易实现

qt属性系统的一个便利之处是,您可以重写setter和getter函数,而用户不必知道它们。例如,假设您的通用属性设置器是
setProperty(名称、值)
。实现者可以在类声明中表示属性“speed”有自己的setter
setSpeed(float value)
,这样当类的用户调用
setProperty(“speed”,100)
的通用版本时,系统将在实例上调用
setSpeed(100)


如果您不需要这样的功能,您可能可以实现自己的财产系统。Gamasutra有一篇关于实现的文章,可能也会对您有所帮助。

我自己三次重新发明了这个轮子(为了练习),每次都在搜索这个主题,但仍然没有找到任何东西!。。哦…像这样的问题让我希望我能发布一些我工作的专有代码。。。我希望在公共API中看到的一个您没有列出的功能是线程安全的。@McKay那么为什么不将其作为商业产品或开源产品发布呢?就个人而言,我不需要内核本身是线程安全的,正如我需要
std::vector
是线程安全的一样,但是使用这样的API编写线程安全库和实现应该很容易。这可能有一天会发生。但是,目前的重点是更大的项目。我们的树能够在每个属性的基础上设置锁定,这与属性通知回调一起充当一个简单的线程消息传递机制。