struct_traitsのカスタマイズ
struct_traitsでメンバポインタが取得できない場合の対応策を考えてみました。
// メンバ入出力カスタマイズ用の構造体 struct in_addr_s_addr { // 構造体の型 typedef in_addr struct_type; // メンバ変数の型 typedef in_addr_t member_type; // 出力時のエンディアン // s_addr自体がビッグエンディアンになっているのでnative static const hamigaki::endianness endian = hamigaki::native; // binary_read()用 in_addr_t& operator()(in_addr& x) const { return x.s_addr; } // binary_write()用 in_addr_t operator()(const in_addr& x) const { return x.s_addr; } }; namespace hamigaki { // メンバサイズを求めるメタ関数を特殊化 template<> struct member_size< ::in_addr_s_addr> : boost::mpl::size_t<4> {}; // memberの代わりにin_addr_s_addrを使う template<> struct struct_traits< ::in_addr> { typedef boost::mpl::single_view< ::in_addr_s_addr > members; }; } // namespace hamigaki
必要なことはカスタマイズ用の構造体を準備することと、それに対してmember_sizeの特殊化を用意することです。
Hamigaki.Binaryには一切手を加えずにサポートできたことは驚きです。
「エンディアンといえばネットワーク」という発想でin_addrを選んでみましたが、in_addrをバイナリ入出力することは普通しませんね。