具有通用获取/设置实现的类属性树数据结构的框架/库?
Posted
技术标签:
【中文标题】具有通用获取/设置实现的类属性树数据结构的框架/库?【英文标题】:framework/library for property-tree-like data structure with generic get/set-implementation? 【发布时间】:2015-05-25 14:51:33 【问题描述】:我正在寻找一种行为类似于 boost::property_tree
但(可选)将每个值项的 get/set 实现留给开发人员的数据结构。
你应该可以做这样的事情:
std::function<int(void)> f_foo = ...;
my_property_tree tree;
tree.register<int>("some.path.to.key", f_foo);
auto v1 = tree.get<int>("some.path.to.key"); // <-- calls f_foo
auto v2 = tree.get<int>("some.other.path"); // <-- some fallback or throws exception
我猜你可能会为此滥用property_tree
,但我还没有研究实现,除非我知道这是一个预期的用例,否则我会对此有不好的感觉。
首先,通过调用提供的函数来编写一个处理像val = tree.get("some.path.to.key")
这样的请求的类看起来并不难,但我可以想象很多特殊情况会使这个库变得相当庞大。
一些额外的功能可能是:
子树处理:不仅处理终端键,而且将某些子树转发到单独的实现。例如
tree.register("some.path.config", some_handler);
// calls some_handler.get<int>("network.hostname")
v = tree.get<int>("some.path.config.network.hostname");
在值/键中搜索
自动类型转换(如boost::property_tree
)
“路径重载”,例如对于没有注册回调的路径,默认为 property_tree 实现。
是否有与我正在寻找的图书馆相近的图书馆?有没有人为此目的使用boost::property_tree
的经验? (例如,通过子类化或将特殊对象放入树中,如 here 所述)
【问题讨论】:
【参考方案1】:在编写自己的容器类多年后,我最终只采用了 QVariantMap。这样,它几乎可以表现(并且与python一样灵活)。只有一个界面。但不适用于性能代码。
如果你想知道,我真的屈服于 Qt 作为我事实上的 STL,因为:
-
行业标准 - 甚至用于航空电子设备和卫星软件
它已经存在了几十年,界面几乎没有变化(考虑长期支持)
它具有出色的性能、出色的文档和庞大的用户群。
广泛的功能集,远远超出 STL
【讨论】:
【参考方案2】:std::map 会做你感兴趣的工作吗? 你试过这种方法吗? 我不太明白你想做什么。所以请提供一个域示例。 干杯。
【讨论】:
那不行,因为我想对树状数据结构进行建模,而std::map
只能映射终端项目。例如。如果myTree.get('path.to.item')
有效并返回值myTree.get('path.to')
隐式也应该有效并返回子树。一种可能的方法是某种地图的地图,其中每个second
项目都包含一个可选值和一个兄弟姐妹列表。但这将是我不想重新发明的。【参考方案3】:
我有一些home-cooked code that lets you register custom callbacks for each type in GitHub。它非常基本,但仍然缺少您想要的大部分功能。不过,我正在开发第二个版本。我正在完成一个辅助结构,它将完成大部分的回调工作。告诉我你是否感兴趣。此外,您可以自己实现其中一些功能,因为注册回调的代码已经完成。应该没那么难。
【讨论】:
【参考方案4】:仅使用提供的数据结构:
首先,getter 和 setter 不是 c++ 的原生特性,您需要以一种或另一种方式调用方法。要使这种行为发生,您可以重载赋值运算符。我假设您还想将 POD 数据存储在您的数据结构中。 因此,在不知道您“获取”的数据类型的情况下,我能想到的唯一选择是使用 boost::variant。但是,您仍然有一些重载工作要做,并且您至少需要一个作业。
您可以查看文档。它非常简单易懂。
http://www.boost.org/doc/libs/1_61_0/doc/html/variant/tutorial.html
制作自己的数据结构:
或者,正如 Dani 所提到的,您可以提出自己的实现并保留重载方法的寄存器等。
最好的
【讨论】:
以上是关于具有通用获取/设置实现的类属性树数据结构的框架/库?的主要内容,如果未能解决你的问题,请参考以下文章
实体框架使用 Codefirst、通用存储库、工作单元模式保存多对多关系