c++的模板特化与函数重载

做项目时我需要序列化STL的map,当然,map本身没有这个功能,我只能自己写。必须写这么各类:能方便的序列化各种map,比如 map<string,sizet>、map< string,vector<sizet> >。我首先想到的是模板特化:

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)
{...}


相关文章

分类

留言:

关于文章

This page contains a single entry by DongHao published on 08 23, 2007 8:31 PM.

推荐一款用于视频下载的firefox插件PBreak was the previous entry in this blog.

“对转螺旋桨”技术浅析 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.