请考虑以下代码段
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
。我认为提升会抛弃const限定符,但似乎并非如此。
答案 0 :(得分:8)
您正在寻找的是文档中的“非默认构造函数”:
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));
}