具有通用get/set实现的属性树数据结构框架/库

framework/library for property-tree-like data structure with generic get/set-implementation?

本文关键字:属性 数据结构 框架 set get 实现      更新时间:2023-10-16

我正在寻找一种数据结构,其行为类似于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")这样的请求,乍一看并不难,但我可以想象很多特殊情况会使这个库变得相当庞大。

一些额外的功能可能是:

  • subtree-handling:不仅处理终端密钥,而且将某些子树转发到单独的实现。例如

    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-implementation,用于没有注册回调的路径。

有图书馆接近我要找的吗?有人为此目的使用boost::property_tree的经验吗?(例如,通过子类化或将特殊对象放入树中,如这里所述)

经过多年编写自己的容器类后,我最终采用了QVariantMap。通过这种方式,它的行为(和python一样灵活)。只有一个界面。

如果你想知道,我真的屈服于Qt作为我事实上的STL,因为:

  1. 行业标准-甚至用于航空电子设备和卫星软件
  2. 它已经存在了几十年,几乎没有改变界面(考虑长期支持)
  3. 它具有出色的性能,令人敬畏的文档和庞大的用户基础。
  4. 广泛的功能集,远远超出STL

std::map能胜任你感兴趣的工作吗?你试过这种方法吗?我不太明白你想干什么。请提供一个域的例子。欢呼。

我有一些自制的代码,可以让您在GitHub中为每种类型注册自定义回调。它是相当基本的,仍然缺少大多数你想要的功能。不过我正在研究第二个版本。我将完成一个助手结构,它将完成大多数回调工作。如果你感兴趣,告诉我。另外,您可以自己实现其中的一些特性,因为注册回调的代码已经完成了。这应该没有那么难。

仅使用已提供的数据结构:

首先,getter和setter并不是c++的原生特性,你需要以这样或那样的方式调用它们。要实现这种行为,可以重载赋值操作符。我假设您也希望在数据结构中存储POD数据。因此,在不知道要"获取"的数据类型的情况下,我能想到的唯一选择就是使用boost::variant。但是,您仍然需要做一些重载,并且您至少需要一个赋值。

您可以查看文档。这是非常直接和容易理解的。

http://www.boost.org/doc/libs/1_61_0/doc/html/variant/tutorial.html


创建自己的数据结构:

或者,正如Dani提到的,您可以提出自己的实现,并保留重载方法的寄存器等等。

最好