【问题标题】:Extend boost property tree get for own types为自己的类型扩展 boost 属性树获取
【发布时间】:2014-06-15 08:19:02
【问题描述】:

如何扩展 boost 属性树以支持我自己的类型?

例如我要写

boost::property_tree::basic_ptree<std::string,std::string> xml;
...
xml.get<int>("level"),
xml.get<double>("accuracy"),
xml.get<Ship>("sauce_pan"),
...

然后我想在某个地方我想描述一下如何从boost::property_tree::basic_ptree&lt;std::string,std::string&gt; 或类似的东西中获取Ship

【问题讨论】:

    标签: c++ boost boost-propertytree


    【解决方案1】:

    您需要为Ship 提供一个默认构造函数和一个流输入运算符:

    struct Ship {
      friend std::istream& operator>>(std::istream& s, Ship& e) {
        /* read ship data from s */
        return s;
      }
    };
    

    不幸的是,我不确定这是否是property_tree 的官方功能,因为我在文档中找不到它。

    对于更细粒度的访问,get 还采用 Translator 作为第二个参数。

    struct ShipTranslatorJSON {
      // the type we return
      typedef Ship external_type;
      // the type expect as an argument
      typedef std::string internal_type;
    
      boost::optional< external_type > get_value(const internal_type&) {
        return external_type();
      }
      // only required when you actually use put
      // boost::optional< T > put_value(const T &); 
    };
    
    
    // use as
    xml.get<Ship>("sauce_pan", ShipTranslatorJSON());
    

    这种方法似乎也更“官方”,尽管文档中没有任何内容真正解释什么是翻译器。

    【讨论】:

    • 我如何根据JSONxml 进行专业化?
    • @Cookie 查看使用Translator 参数编辑get
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2021-01-09
    相关资源
    最近更新 更多