我正在寻找一个与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
)是否有一个接近我正在寻找的图书馆?有没有人为此目的使用boost::property_tree
做过经验? (例如,通过子类化或将特殊对象放入树中,如描述here)
答案 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,因为: