使用成员函数和自由函数的boost :: serialization

时间:2012-03-28 22:11:48

标签: c++ serialization boost boost-serialization

我有一个来自3rdparty开源数学库的mat4课程。它没有自己的序列化方法,所以我在我的主项目中创建了一个包含矩阵mat4序列化的单独标题:

namespace boost {
namespace serialization {

template<class Archive>
void serialize(Archive & ar, mat4 & matrix, const unsigned int version)
{
// some serialization of matrix goes here...
}

} // namespace serialization
} // namespace boost

直到稍后我将序列化直接添加到类mat4并忘记删除旧的序列化时,它才能完美运行:

struct mat4 
{
    friend class boost::serialization::access;

    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version)
    {           
         ar & BOOST_SERIALIZATION_NVP(data);    
    } 
    // some other members and functions goes here
};

经过这样的修改后,调用了自由函数序列化。 你能解释为什么调用自由函数而不是mat4成员函数吗?也许,我错过了标准中的一些简单规则。

当我注释掉自由函数时 - 调用成员函数。

1 个答案:

答案 0 :(得分:1)

原因在于boost::serialization使用的技术允许自由功能和成员职能。基本上有一个带有以下签名的自由函数:

 template< typename Archive, typename Type >
 void serialize( Archive& a_Arch, Type& a_Inst, const unsigned int a_Version )
 {
       a_Inst.serialize( a_Arch, a_Version );
 }

当C ++认为函数匹配时,最专业的一个胜出,这意味着Type不那么通用的任何自由函数,例如用户定义的自由序列化函数总是胜利。如果没有,则上述函数胜出,这仅适用于Type,其序列化成员接受存档&amp;版本