2016-08-23 6 views
0

Boost PropertyTreeは、特殊化をtranslator_betweenに指定してカスタムタイプのシリアル化を可能にしていますが、ドキュメントを見つけることができず、コードはかなりわかりにくい場合があります。カスタムタイプを処理するためにproperty_treeを拡張する方法を教えてください。

+0

これに関連して[類似の質問](http://stackoverflow.com/questions/9745716/change-how-boostproperty-tree-reads-translates-strings-to-bool)がありますが、答えは1つしか提供しません例、一般的な説明ではありません。 –

答えて

1

カスタム型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 

KeyTypeptreeiptreeためstd::stringでなければならない、と一般的にあなたのbasic_ptreeの最初のテンプレート引数と同じでなければなりません。あなたはそのような場合にtypeをテンプレートにすることができます。

internal_typeexternal_typeの2つのtypedefは必須であり、ptree_utils.hppdetail::is_translator<Translator>で使用されます。

translator_between::typeをtypedefにすることはできますが、技術的には必要ないことに注意してください。私は彼らがすべての例でそれをやっていると思っています。

引数はget_valueput_valueである必要はありませんが、必ずしもconst &である必要はありませんが、その理由を考えることはできません。

一般に、translator_betweenの宣言をどこに置くか注意してください。特に、ストリーミング演算子がCustomTypeにオーバーロードされている場合は注意してください。この場合、おそらく演算子の宣言の隣にtranslator_betweenを置くべきです。

関連する問題