c++的模板特化与函数重载
做项目时我需要序列化STL的map,当然,map本身没有这个功能,我只能自己写。必须写这么各类:能方便的序列化各种map,比如 map<string,sizet>、map< string,vector<sizet> >。我首先想到的是模板特化:
1. ContainerSerial的生命周期依赖于StringSizeMap,看以上代码,如果myMap析构了,serialer却还在那里save、 load,肯定是core dump.在c++中,对象的生命周期管理是很费精力的事,所以要避免两个对象产生生命期依赖。
2. 由于是模板,整个实现代码都放在一个ContainerSerial.h文件里,其它cpp文件来include它,于是各个类对应的object文件都带有ContainerSerial的实现,最后链接时造成"function xxx redefined"...这个问题虽然可以绕开,但使用模板特化毕竟是比较复杂的事情,它的引入难免对源代码结构产生冲击。
其实干嘛想这么复杂呢?用c++的函数重载就可以做到了!
template<class T> class ContainerSerial { }; typedef map<string,size_t> StringSizeMap; template<> class ContainerSerial<StringSizeMap> { public: ContainerSerial(StringSizeMap& m):m_container(m){} //对应StringSizeMap的实现 save(){...} load(){...} private: StringSizeMap& m_container; }; typedef map< string,vector<size_t> > StringVecSizeMap; template<> class ContainerSerial<StringVecSizeMap> { public: ContainerSerial(StringVecSizeMap& m):m_container(m){} //对应StringVecSizeMap的实现 save(){...} load(){...} private: StringVecSizeMap& m_container; };这样在使用时就可以挑选想要使用的ContainerSerial:
StringSizeMap myMap; ContainerSerail<StringSizeMap> serialer(myMap); serialer.save(); serialer.load();这个实现有几个问题:
1. ContainerSerial的生命周期依赖于StringSizeMap,看以上代码,如果myMap析构了,serialer却还在那里save、 load,肯定是core dump.在c++中,对象的生命周期管理是很费精力的事,所以要避免两个对象产生生命期依赖。
2. 由于是模板,整个实现代码都放在一个ContainerSerial.h文件里,其它cpp文件来include它,于是各个类对应的object文件都带有ContainerSerial的实现,最后链接时造成"function xxx redefined"...这个问题虽然可以绕开,但使用模板特化毕竟是比较复杂的事情,它的引入难免对源代码结构产生冲击。
其实干嘛想这么复杂呢?用c++的函数重载就可以做到了!
//ContainerSerial.h: saveContainer(StringSizeMap& m); loadContainer(StringSizeMap& m); saveContainer(StringVecSizeMap& m); loadContainer(StringVecSizeMap& m); //ContainerSerial.cpp: saveContainer(StringSizeMap& m) {...} loadContainer(StringSizeMap& m) {...} saveContainer(StringVecSizeMap& m) {...} loadContainer(StringVecSizeMap& m) {...}
相关文章
- fedora 9 小集 - 01 05, 2009
- 多线程调试 - 12 17, 2008
- fedora 9 试用 - 12 05, 2008
留言: