具有通用get / set-implementation的属性树类数据结构的框架/库?

时间:2015-05-25 14:51:33

标签: c++ boost-propertytree

我正在寻找一个与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")这样的请求的类,首先看起来并不太难,但我可以想象很多特殊情况会使这个库变得非常庞大。

一些额外的功能可能是:

  • 子树处理:不仅处理终端密钥,而且将某些子树转发给单独的实现。 E.g。

    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

4 个答案:

答案 0 :(得分:0)

std :: map会做你感兴趣的工作吗? 你尝试过这种方法吗? 我不太明白你想做什么。所以请提供一个域示例。 欢呼声。

答案 1 :(得分:0)

我有一些home-cooked code that lets you register custom callbacks for each type in GitHub。这是非常基本的,但仍然缺少您希望拥有的大多数功能。不过,我正在研究第二个版本。我正在完成一个辅助结构,它将完成大部分回调工作。如果你有兴趣告诉我。此外,您可以自己实现其中的一些功能,因为注册回调的代码已经完成。它不应该那么困难。

答案 2 :(得分:0)

仅使用提供的数据结构:

首先,getter和setter不是c ++的本机特性,你需要以这种或那种方式调用方法。要使这种行为发生,您可以重载赋值运算符。我假设您也想在您的数据结构中存储POD数据。 因此,如果不知道您正在“获取”的数据类型,我能想到的唯一选择是使用boost :: variant。但是,你仍然需要做一些超载,而且至少需要一个任务。

您可以查看文档。这非常简单易懂。

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

制作自己的数据结构:

或者,正如Dani所提到的,您可以提出自己的实现并保留重载方法的注册表等。

最佳

答案 3 :(得分:0)

经过多年对我自己的容器类的编码,我最终只采用了QVariantMap。这样它几乎可以表现(并且像python一样灵活)。只有一个界面。但不是性能代码。

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

  1. 行业标准 - 甚至用于航空电子设备和卫星软件
  2. 它已经存在了几十年,界面变化很小(想想长期支持)
  3. 它具有出色的性能,出色的文档和庞大的用户群。
  4. 广泛的功能集,超越STL