Boost PropertyTree允许通过提供translator_between
的专业化来自定义类型的序列化,但我找不到任何文档,代码可能非常神秘。
答案 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
对于KeyType
和std::string
, ptree
必须为iptree
,并且通常必须与basic_ptree
的第一个模板参数相同。如果您涉及这类事情,可以将type
设为模板。
两个typedef internal_type
和external_type
是强制性的,它们在detail::is_translator<Translator>
的{{1}}中使用。
请注意,您可以将ptree_utils.hpp
设为typedef,但技术上并不需要。我怀疑他们在所有例子中都这样做,以使定义更加漂亮。
translator_between::type
和get_value
的论点不一定需要put_value
,但我想不出改变它的理由。
一般要注意您放置const &
声明的位置,特别是如果您的CustomType重载了流操作符。在这种情况下,您应该将translator_between
放在操作符的声明旁边。