標準のproperty_treeは、次のように定義されているため、キーごとに1つの文字列値のみを処理します。
typedef basic_ptree<std::string, std::string> ptree;
したがって、唯一のオプションは、文字列を使用してそれらを解析することです。最良の方法は、低い値と高い値を格納する新しいクラスを定義してから、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;
};
翻訳者は次のようになります。
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を次のように使用できます。
pt.get<low_high_value>("box.x")
pt.put("box.u", low_high_value(-110, 200));