cerealは説明不要のシリアライズ用ライブラリ。派生クラスをstd::unique_ptr<Base>として持っている時の最小サンプル。cereal::base_class<Base>(this)をシリアライズするのを忘れないCEREAL_REGISTER_TYPE(sample::Derived)を名前空間の外に書く。sample::Derived)を名前空間の外に書く。0;}以下ではソースを読みもしていないのにcerealが中で何をしているか想像している。自分でシリアライズライブラリを書こうとしたときの経験からして、恐らく上記のマクロで型情報を読んだあと実施にその型を生成するための関数なんかを用意しているのだろう。別個に書いても動くこと、ヘッダオンリーであることから、恐らくstaticなコンテナがcerealの奥深くにあって、このマクロでそこにBaseからDerivedにキャストする関数か関数オブジェクトを登録していくのだろう。ある型のインスタンスを作る関数は静的に作っておかないといけないわけだし、その目的にはテンプレート特殊化が一番手っ取り早かろう。普通に自前で実装するなら以下のような感じになると思われる。いえライブラリはユーザー定義クラスを事前に知ることはできない。上のような愚直なコードは書けない。名前からテーブル引きするしかないだろう。loader(data);}この想像があっていた場合、そういう関数オブジェクトは普通に考えてcerealの内部実装に近いところだから、cereal::detailとかに定義されていると思われる。cereal::implとかかもだが。マクロはnamespaceをその場で開くはずなので、ユーザー定義名前空間の中でCEREAL_REGISTER_TYPEを書いても動かない。こんな単純じゃないだろうが。想像で説明するくらいならソースコードを読め。pointerを使う場面なんか話題になっていたので、具体例を考えてみたい。(7)はてなブログをはじめよう!tniinaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。