如何扩展boost property_tree以处理自定义类型?

时间:2016-08-23 12:10:37

标签: boost-propertytree

Boost PropertyTree允许通过提供translator_between的专业化来自定义类型的序列化,但我找不到任何文档,代码可能非常神秘。

1 个答案:

答案 0 :(得分:2)

自定义类型CustomType的一般模式是:

namespace boost {
namespace property_tree {

template<>
struct translator_between<KeyType, CustomType>
{
  struct type {
    typedef KeyType internal_type;
    typedef CustomType external_type;
    boost::optional<external_type> get_value(const internal_type& str);
    boost::optional<internal_type> put_value(const external_type& obj);
  };
};

} // namespace property_tree
} // namespace boost
对于KeyTypestd::string

ptree必须为iptree,并且通常必须与basic_ptree的第一个模板参数相同。如果您涉及这类事情,可以将type设为模板。

两个typedef internal_typeexternal_type是强制性的,它们在detail::is_translator<Translator>的{​​{1}}中使用。

请注意,您可以将ptree_utils.hpp设为typedef,但技术上并不需要。我怀疑他们在所有例子中都这样做,以使定义更加漂亮。

translator_between::typeget_value的论点不一定需要put_value,但我想不出改变它的理由。

一般要注意您放置const &声明的位置,特别是如果您的CustomType重载了流操作符。在这种情况下,您应该将translator_between放在操作符的声明旁边。