сериализация класса с константными членами с использованием Boost - PullRequest
0 голосов
/ 30 мая 2018

Рассмотрим следующий фрагмент кода

class tmp1
{
    const int a_;
    const double b_;   
    friend class boost::serialization::access;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int ver)
    {
        ar & a_ & b_ ;
    }

public:
    tmp1(const itype a , const ftype b) : a_(a), b_(b)
    {}
};

Я могу записать объект в файл, выполнив

tmp1 t1(2, 10.0);    
std::string filename ="D:/Temp/demofile.txt";
std::ofstream ofs(filename);    
boost::archive::text_oarchive oa(ofs);
oa<<t1;

Я хотел бы создать другой экземпляр tmp1, прочитавфайл.В идеале я хотел бы, чтобы это происходило во втором конструкторе, который берет имя файла и создает его.Как мне это сделать?

Я пытался

tmp1 t2(10, 100.0);
    std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
ia>>t2;

, но компиляция VS2012 не удалась со следующим сообщением

archive/detail/check.hpp(162): error C2338: typex::value
4>          \boost\boost_1_67_0\boost/archive/detail/iserializer.hpp(611) : see reference to function template instantiation 'void boost::archive::detail::check_const_loading<T>(void)' being compiled
4>          with
4>          [
4>              T=const itype
4>          ]

, которое я предполагаю из-за членов const.Я думал, что boost отбросит квалификатор const, но, похоже, это не так.

1 Ответ

0 голосов
/ 30 мая 2018

В документации вы ищете "конструкторы не по умолчанию":

https://www.boost.org/doc/libs/1_67_0/libs/serialization/doc/index.html

Вам необходимо написать перегрузку для

template<class Archive, class T>
void load_construct_data(
    Archive & ar, T * t, const unsigned int file_version
);

поэтому для класса Foo, который, например, состоит из целого числа и строки, вы должны указать:

template<class Archive>
void load_construct_data(
    Archive & ar, Foo * t, const unsigned int file_version
)
{
    int a;
    std::string b;
    ar >> a >> b;
    new (t) Foo(a, std::move(b));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...