Boost property_tree: multiple values per key

前端 未结 1 2108

Boost property tree seems like an excellent library to use for parsing config files. However, I can\'t figure out how to handle situations where there are multiple values pe

相关标签:
1条回答
  • 2020-12-18 12:38

    The standard property_tree handles only one string value per key since it is defined as:

    typedef basic_ptree<std::string, std::string> ptree;
    

    So, the only option is to use strings and parse them. I think the best method is to define a new class that stores the low and high values and then create a translator class for the get and set methods. For example:

    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;
    };
    

    The translator would be:

    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());
      }
    };
    

    The previous get_value method is very simple. It should be improved if the file could be written by the user.

    This class should be registered using:

    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;
      };
    } }
    

    After you include the previous code, you can use property_tree as:

      pt.get<low_high_value>("box.x")
      pt.put("box.u", low_high_value(-110, 200));
    
    0 讨论(0)
提交回复
热议问题