具有通用获取/设置实现的类属性树数据结构的框架/库?

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 所提到的,您可以提出自己的实现并保留重载方法的寄存器等。

最好的

【讨论】:

以上是关于具有通用获取/设置实现的类属性树数据结构的框架/库?的主要内容,如果未能解决你的问题,请参考以下文章

具有 EntityFramework 的通用存储库

实体框架使用 Codefirst、通用存储库、工作单元模式保存多对多关系

MATLAB 中 A = K * B 的类(具有依赖行为的非依赖属性)

动手打造深度学习框架:基本数据结构与算法

从数据库中获取具有一对多关系的特定产品

树——通用树中属性操作的实现