BOOST Property_Tree:每个密钥的多个值
Boost property_tree: multiple values per key
Boost属性树似乎是一个出色的库,用于解析配置文件。但是,我不知道如何处理每个键有多个值的情况。例如,假设我正在指定这样的盒子:
box
{
x -1 1
y -1 1
z -1 1
}
其中x
,y
和z
分别是x
,y
和z
轴的框的边界,使用property_tree的信息格式指定。我在手册中看到了使用引号用于使用空间的值的手册,但是我看不出可以将这些值导入数字。我必须将字符串分解为数字,这似乎首先打败了使用property_tree的目的。我当然可以给每个数字一个关键:
box
{
xlo -1
xhi 1
ylo -1
yhi 1
zlo -1
zhi 1
}
,但这似乎很麻烦,并且会夸大我的配置文件。我还指出,我可以在program_options中处理这种情况,但是我丢失了嵌套的配置文件功能(是的,我知道我可以使用点表示法来"嵌套",但并不相同)。
是否有一种方法来导入例如x作为这样的数字列表?
标准property_tree每个键仅处理一个字符串值,因为它被定义为:
typedef basic_ptree<std::string, std::string> ptree;
因此,唯一的选择是使用字符串并解析它们。我认为最好的方法是定义一个新的类,该类存储低和高值,然后为get和设置方法创建转换类别。例如:
struct low_high_value
{
low_high_value() : m_low(0), m_high(0) { }
low_high_value(double low, double high) : m_low(low), m_high(high) { }
double m_low;
double m_high;
};
翻译器将是:
struct low_high_value_translator
{
typedef std::string internal_type;
typedef low_high_value external_type;
// Get a low_high_value from a string
boost::optional<external_type> get_value(const internal_type& str)
{
if (!str.empty())
{
low_high_value val;
std::stringstream s(str);
s >> val.m_high >> val.m_low;
return boost::optional<external_type>(val);
}
else
return boost::optional<external_type>(boost::none);
}
// Create a string from a low_high_value
boost::optional<internal_type> put_value(const external_type& b)
{
std::stringstream ss;
ss << b.m_low << " " << b.m_high;
return boost::optional<internal_type>(ss.str());
}
};
以前的get_value方法非常简单。如果文件可以由用户编写,则应改进它。
该类应使用:
注册namespace boost { namespace property_tree
{
template<typename Ch, typename Traits, typename Alloc>
struct translator_between<std::basic_string< Ch, Traits, Alloc >, low_high_value>
{
typedef low_high_value_translator type;
};
} }
包含上一个代码后,您可以使用property_tree AS:
pt.get<low_high_value>("box.x")
pt.put("box.u", low_high_value(-110, 200));
相关文章:
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 允许从 std::map 的密钥窃取资源?
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 在没有密钥的情况下读取密文的剩余噪声预算
- 如何修复无效的API密钥,IP或操作权限错误?
- 所有可能的链接生成器与64位密钥
- 如何在unordered_map中更改密钥?
- 获取当前密钥状态?
- curl_easy_perform() 失败:SSL 对等证书或 SSH 远程密钥不正常
- 将密钥发送到非前台的游戏窗口
- 有哪些方法可以对基于 256 位密钥的矩阵进行加扰?
- 如何在精灵表上的两个不同部分之间来回切换,同时用户仍使用 SFML 持有密钥
- 如何将CNG密钥转换为OpenSSL EVP_PKEY(反之亦然)?
- 运行密钥密码解密知道密钥?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- 封装 std::map 以允许迭代,但没有直接密钥访问?
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 如何在C++中创建自己的编译密钥
- 重载std::映射不同的密钥类型
- 使用C/C++访问OS X密钥链