如果您希望属性树反映层次结构,则需要编写自定义解析器。根据 INI 解析器文档:
INI 是一种简单的键值格式,具有单级分段。[...] 并非所有属性树都可以序列化为 INI 文件。
由于是单级分段,my.section.subsection1
必须将其视为键,而不是层次路径。例如,my.section.subsection1.someProp1
路径可以分解为:
key separator value
.----------^---------. ^ .---^---.
|my.section.subsection1|.|someProp1|
因为 ”。” 是键的一部分,boost::property_tree::string_path
必须使用不同的分隔符显式实例化类型。它可以作为path_type
typedef on 使用ptree
。在这种情况下,我选择使用“/”:
ptree::path_type("my.section.subsection1/someProp1", '/')
使用 example.ini 包含:
[my.section.subsection1]
someProp1=0
[my.section.subsection2]
anotherProp=1
以下程序:
#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
int main()
{
namespace pt = boost::property_tree;
pt::ptree propTree;
read_ini("example.ini", propTree);
boost::optional<uint32_t> someProp1 = propTree.get_optional<uint32_t>(
pt::ptree::path_type( "my.section.subsection1/someProp1", '/'));
boost::optional<uint32_t> anotherProp = propTree.get_optional<uint32_t>(
pt::ptree::path_type( "my.section.subsection2/anotherProp", '/'));
std::cout << "someProp1 = " << *someProp1
<< "\nanotherProp = " << *anotherProp
<< std::endl;
}
产生以下输出:
someProp1 = 0
anotherProp = 1