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

Posted

技术标签:

【中文标题】模块属性名称-值对 C++ API 框架 - 重新发明?【英文标题】:Module properties name-value pair C++ API framework - reinvention? 【发布时间】:2011-04-26 08:01:54 【问题描述】:

我经常遇到允许用户获取和设置控制模块操作的各种参数的 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 框架吗?

【问题讨论】:

我自己重新发明了这个*** 3 次(为了练习),每次都搜索该主题,但仍然一无所获!.. 哦... 像这样的问题让我希望我可以发布一些我正在研究的专有代码...您没有列出但我希望在公共 API 中看到的功能是 线程安全. @McKay 那么为什么不将它作为商业产品或开源产品发布呢?就我个人而言,我不需要核心本身是线程安全的,就像我需要 std::vector 是线程安全的一样,但是使用这样的 API 编写线程安全的库和实现应该很容易。 这可能有一天会发生。但是,目前的重点是更大的项目。我们的树能够基于每个属性设置锁定,这与属性通知回调一起用作简单的线程消息传递机制。 【参考方案1】:

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

如果您拥有类似的行为良好的班级,例如可能Boost::Variant 或类似的属性系统很容易使用字符串映射作为支持部分来实现。

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于模块属性名称-值对 C++ API 框架 - 重新发明?的主要内容,如果未能解决你的问题,请参考以下文章

Python C API - 重新加载模块

在Prestashop API上创建订单:模块名称出错

深入出不来nodejs源码-timer模块(C++篇)

python遍历并获取对象属性--dir(),__dict__,getattr,setattr

nodejs v8 新特性——利用N-API编写c++ node扩展

.Net core 3.0 API 不使用连字符绑定属性