2012-03-28 1 views
1

Ich habe eine Klasse Mat4 von 3rd Party Open Source Math Bibliothek. Es hat keine eigene Serialisierungsmethode, also habe ich einen separaten Header in meinem Hauptprojekt erstellt, die eine Serialisierung der Matrix MAT4 enthält:Boost :: Serialisierung mit Member-Funktion und freie Funktion

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 

Es funktionierte perfekt, bis später, als ich die Serialisierung direkt in die Klasse MAT4 hinzugefügt und vergessen, die alte Serialisierung zu entfernen:

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

Nach einer solchen Änderung wurde die freie Funktion serialize aufgerufen. Könnten Sie bitte erklären, warum die free-Funktion anstelle der mat4-Member-Funktion aufgerufen wurde? Wahrscheinlich gibt es im Standard eine einfache Regel, die ich vermisst habe.

Wenn ich die freie Funktion auskommentieren - Member-Funktion wird aufgerufen.

Antwort

1

Der Grund ist aufgrund der von boost::serialization verwendeten Technik, um beide eine freie Funktion & Mitgliedsfunktionen zu ermöglichen. Grundsätzlich gibt es eine freie Funktion mit der folgenden Signatur:

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

Wenn C++ betrachtet eine Übereinstimmung für eine Funktion derjenige, der am meisten spezialisierte Siegen aus, was bedeutet, dass jede freie Funktion, wo Type weniger generisch, wie der Benutzer Definierte freie Serialisierungsfunktionen gewinnen immer. Wenn es keine gibt, gewinnt die obige Funktion, die nur für Type mit einem serialize-Mitglied, das eine Archiv &-Version akzeptiert, gut gebildet ist.

+0

danke! sehr schöne Technik. – innochenti