boost :: сериализация с функцией-членом и свободной функцией - PullRequest
1 голос
/ 29 марта 2012

У меня есть класс mat4 из 3-й части математической библиотеки с открытым исходным кодом.У него нет собственного метода сериализации, поэтому я создал отдельный заголовок в своем основном проекте, который содержит сериализацию матрицы 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
};

После такой модификации была вызвана бесплатная функция serialize.Не могли бы вы объяснить, почему была вызвана функция free вместо функции-члена mat4?Возможно, в стандарте есть некое простое правило, которое я пропустил.

Когда я закомментирую свободную функцию - вызывается функция-член.

1 Ответ

1 голос
/ 29 марта 2012

Причина заключается в методике, используемой 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 с элементом сериализации, который принимает архив и версию.

...