我通过确保继承层次结构中的类实现虚拟读写功能来实现序列化:
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”函数的重载,以允许通过基类指针轻松输入/输出:
#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 设计?