2012-03-28 8 views
1

私は3rdpartyオープンソースの数学ライブラリからクラスmat4を持っています。それは自分のシリアル化の方法を持っていないので、私は行列MAT4のシリアライズが含まれている私のメインのプロジェクトで別のヘッダー作成しました:メンバー関数とフリー関数を使ったboost :: serialization

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

このような変更の後、free関数のserializeが呼び出されました。 mat4メンバー関数の代わりにフリー関数が呼び出された理由を教えてください。おそらく、私が逃した標準のいくつかの単純なルールがあります。

私がコメントアウトすると、free関数メンバ関数が呼び出されます。

答えて

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++の意味機能を最大限専門の勝利をある1、の一致を考慮

そのTypeは、ユーザーとして、以下の一般的な任意のフリー機能定義されたフリーシリアル化関数が常に勝つ。存在しない場合は、に対しては、&というバージョンのアーカイブを受け入れるserializeメンバーでのみうまく機能しています。

+0

ありがとうございます!非常に美しいテクニック。 – innochenti

関連する問題