gpt4 book ai didi

c++ - boost 序列化 std::unique_ptr 支持

转载 作者:可可西里 更新时间:2023-11-01 16:27:26 26 4
gpt4 key购买 nike

boost序列化库支持std::unique_ptr的序列化吗?我试图编译下面的代码,但如果我包含boost::archive::text_oarchive oa(ofs); oa << g; 行,

编译器(顺便说一句,带有 -std=c++11 标志的 gcc4.7)抛出一个错误

/usr/include/boost/serialization/access.hpp:118:9: 错误:‘class std::unique_ptr’没有名为‘serialize’的成员

#include <iostream>
#include <memory>
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
class MyDegrees
{
public:
void setDeg(int d){deg = d;}
int getDeg()const {return deg;}
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{ ar & deg; }
int deg;
};
class gps_position
{
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{ ar & degrees; }
std::unique_ptr<MyDegrees> degrees;
public:
gps_position(): degrees(std::unique_ptr<MyDegrees>(new MyDegrees)){};
void setDeg(int d){degrees->setDeg(d);}
int getDeg() const {return degrees->getDeg();}
};
int main()
{
std::ofstream ofs("filename");
gps_position g;
g.setDeg(45);
std::cout<<g.getDeg()<<std::endl;
{// compiler error, fine if commented out
boost::archive::text_oarchive oa(ofs); oa << g;
}
return 0;
}

最佳答案

我不确定如何解释 this list , 但似乎在 1.48 之后的某个时候添加了对此的支持。我使用的是 1.58,它包含在内。只是

#include <boost/serialization/unique_ptr.hpp>

然后它将按如下方式工作:

#include <memory>

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/unique_ptr.hpp>

#include <fstream>

class Point
{
public:
Point() { }

float x = 1.;
float y = 2.;
float z = 3.;

private:
friend class boost::serialization::access;

template<class TArchive>
void serialize(TArchive & archive, const unsigned int version)
{
archive & x;
archive & y;
archive & z;
}
};

void ValidUniquePointer()
{
std::unique_ptr<Point> p(new Point());

std::ofstream outputStream("test.txt");
boost::archive::text_oarchive outputArchive(outputStream);
outputArchive << p;
outputStream.close();

// read from a text archive
std::unique_ptr<Point> pointRead;
std::ifstream inputStream("test.txt");
boost::archive::text_iarchive inputArchive(inputStream);
inputArchive >> pointRead;

std::cout << pointRead->x << " " << pointRead->y << " " << pointRead->z << std::endl;

}

void NullUniquePointer()
{
std::unique_ptr<Point> p;

std::ofstream outputStream("test.txt");
boost::archive::text_oarchive outputArchive(outputStream);
outputArchive << p;
outputStream.close();

// read from a text archive
std::unique_ptr<Point> pointRead;
std::ifstream inputStream("test.txt");
boost::archive::text_iarchive inputArchive(inputStream);
inputArchive >> pointRead;

if(pointRead != nullptr) {
std::cout << pointRead->x << " " << pointRead->y << " " << pointRead->z << std::endl;
}
else {
std::cout << "Pointer is null!" << std::endl;
}

}

int main()
{
ValidUniquePointer();
NullUniquePointer();
return 0;
}

关于c++ - boost 序列化 std::unique_ptr 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12915267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com