在 boost::property_tree 中存储类
Posted
技术标签:
【中文标题】在 boost::property_tree 中存储类【英文标题】:Storing classes in a boost::property_tree 【发布时间】:2013-04-02 19:04:58 【问题描述】:我正在开发一个程序来记录程序中变量的信息。我想按文件 -> 函数 -> 变量对这些信息进行分组。
boost::property_tree 似乎很适合这种情况,因为我可以将 Access 对象存储在树中的路径 (file.function.variable
) 中,然后轻松将树转换为 XML、JSON 等。
假设我正在记录变量的使用次数。我可以有一个 Access 类来跟踪对变量的写入和读取次数。然后我可以将此对象存储在树中的 file.function.variable 中。每次访问变量时,我都可以在树中找到变量并更新有关它的信息。
但是,我不知道如何在树中存储一个类。我假设有一些我需要实现或子类化的东西,但文档没有解决我想要做的事情。
我的问题有解决方案吗?有没有比 boost::property_tree 更好的选择?
谢谢。
【问题讨论】:
【参考方案1】:boost::property_tree
旨在保存文本数据。这就是它适合导出到 XML、JSON 等的原因。
修改您的类Access
,使其包含与文本相互转换并将该文本存储在树中的方法。
【讨论】:
我真的不想拥有这样一个巨大的嵌套结构,因为它会随着嵌套的深入而变得更大。例如,将来我可能希望通过文件夹->文件->函数->变量来存储东西。理想情况下,我想在我的类中添加一个方法,允许它在包含它的树上调用 write_json(tree) 时将自身转换为 XML/JSON。 那么绝对没有办法将类存储为节点并在转换开始时将其转换为适当的文本格式?我想将 Access 对象存储在树中,因为它们将在我的程序运行时更新,我不能只转换它们并存储文本,因为我需要一种稍后访问和更新它们的方法。 @tgt 绝对可以,但是根据您独特的需求列表,可能没有预先编写的解决方案可供您使用。 我的要求有什么独特之处?我只想将一个类存储在树中,并有一两个方法将其转换为适当的格式。一种解决方案可能是:如果 ptree 中的每个节点都是 ptree,我可以使我的类成为 ptree 的子类,并在类的属性发生更改时更新此树。但是,这似乎不起作用。 谢谢。那我一定是在做其他错误的事情。我会调查的。【参考方案2】:您可以放弃树的想法,而只使用键值对的平面图。
例子:
std::map<std::string, Access> accesses;
// add one access
accesses["file.function.variable"] += 1;
您只需要编写一个从其内容生成 JSON 的例程,这应该很简单。 (假设键的第一部分始终是文件,第二部分始终是函数,第三部分始终是变量。)
【讨论】:
以上是关于在 boost::property_tree 中存储类的主要内容,如果未能解决你的问题,请参考以下文章
从 boost::property_tree 读取数组出现空白
如何从 boost::property_tree 获取枚举?
boost::property_tree::xml_writer_settings 的编译错误