我经常遇到API,允许用户获取和设置控制模块操作的各种参数。我现在发现自己正在考虑编写另一个属性API,但不想重新发明轮子。
以下是典型的基本客户端代码:
setInt("bitrate", 1000);
setEnum("mode", MODE_FAST);
setStr("output file", "music.mp3");
通常可以设置许多参数,并且这些属性集通常在不断发展中。
有些API比其他API更智能,更高级的功能是:
除了上面示例代码中的C风格访问器之外,我还遇到了以下框架:
IPersistPropertyBag
我希望找到一个精心设计的公共图书馆,为上述所有内容提供框架,但到目前为止已经空白了。我知道Boost.PropertyTree但它只是一个骨架。我应该注意其他可移植属性API框架吗?
答案 0 :(得分:2)
Qt属性系统的一个关键元素实际上是变体类型类QVariant
的非常可靠的实现,使您可以删除键入的setInt
,setString
。 ..电话。
如果你掌握了类似表现良好的课程,例如:可能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。