継承階層内のクラスが仮想読み取りおよび書き込み関数を実装することを確認することで、シリアル化を実装しました。
class base
{
...
virtual void read(std::istream&)=0;
virtual void write(std::ostream&) const=0;
virtual std::string is_a() const;
};
BEGIN_NAMESPACE_1(io)
SERIALISE(base)
END_NAMESPACE_1
ここで、マクロ "SERIALISE" は "serialise" および "deserialise" 関数のオーバーロードを実装して、基本クラス ポインターを介した簡単な i/o を可能にします。
#define SERIALISE(TYPE)\
void deserialise( boost::shared_ptr<TYPE>& dat, std::istream& ifs )\
{\
std::string type;\
read(type, ifs);\
\
dat = TYPE::make_##TYPE(type);\
dat->read(ifs);\
}\
\
void serialise( const boost::shared_ptr<TYPE>& dat, std::ofstream& ofs )\
{\
write(dat->is_a(), ofs);\
dat->write(ofs);\
}
ただし、基本クラスに純粋な仮想関数が含まれている場合、おそらくコンパイラが抽象をインスタンス化しようとするため、「抽象型「ベース」のオブジェクトを次の関数が純粋であるため、割り当てられません...」というコンパイラ エラーが発生します。クラス名がマクロ呼び出しに渡されるときの基本クラス。この I/O 設計を救済する方法はありますか?