Fad*_*mic 3 c++ boost configuration-files boost-propertytree
Boost属性树看起来像是一个用于解析配置文件的优秀库.但是,我无法弄清楚如何处理每个键有多个值的情况.例如,假设我正在指定一个这样的框:
box
{
x -1 1
y -1 1
z -1 1
}
Run Code Online (Sandbox Code Playgroud)
其中x,y和z是框的边界上x,y和z轴分别使用property_tree的INFO格式指定.我在手册中提到使用带有空格的值的引号,但后来我没有看到我可以将这些值作为数字导入.我必须将字符串解析为数字,这似乎首先打败了使用property_tree的目的.我当然可以给每个数字一个关键:
box
{
xlo -1
xhi 1
ylo -1
yhi 1
zlo -1
zhi 1
}
Run Code Online (Sandbox Code Playgroud)
但这似乎很麻烦,并会膨胀我的配置文件.我还注意到我可以在program_options中处理这种情况,但是我失去了嵌套的配置文件功能(是的,我知道我可以使用点符号来"嵌套",但它不一样).
有没有办法导入例如x作为这样的数字列表?
标准property_tree每个键只处理一个字符串值,因为它被定义为:
typedef basic_ptree<std::string, std::string> ptree;
Run Code Online (Sandbox Code Playgroud)
因此,唯一的选择是使用字符串并解析它们.我认为最好的方法是定义一个存储低值和高值的新类,然后为get和set方法创建一个翻译类.例如:
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;
};
Run Code Online (Sandbox Code Playgroud)
翻译将是:
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());
}
};
Run Code Online (Sandbox Code Playgroud)
之前的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;
};
} }
Run Code Online (Sandbox Code Playgroud)
包含前面的代码后,可以使用property_tree:
pt.get<low_high_value>("box.x")
pt.put("box.u", low_high_value(-110, 200));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2418 次 |
| 最近记录: |