2012-03-28 56 views
1

我有一個來自3rdparty開源數學庫的mat4類。它沒有自己的序列化方法,所以我創建了我的主要項目中一個單獨的頭包含矩陣MAT4的系列化:boost ::具有成員函數和自由函數的序列化

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 
}; 

經過這樣的修改後,自由函數serialize被調用。 你能解釋爲什麼自由函數被調用而不是mat4成員函數嗎?也許,我錯過了一些簡單的標準規則。

當我註釋掉免費函數 - 調用成員函數。

回答

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的序列化成員可以接受&版本的檔案時纔會生效。

+0

謝謝!非常漂亮的技術。 – innochenti 2012-03-29 20:02:41

相關問題