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をバイナリ入出力することは普通しませんね。