gpt4 book ai didi

c++ - 包含 Map(具有对象值)和 Multimap(具有 std::string 值)的对象的 boost 序列化:需要什么?

转载 作者:可可西里 更新时间:2023-11-01 17:57:20 28 4
gpt4 key购买 nike

请参阅下面的 main() 和两个非常简单的类。然后根据 Boost 序列化(以及显示的内容)我的问题是:

1) B 类是否需要定义正常的重载流插入运算符“<<”和“>>”?目前在我的真实代码中没有这些。

2) store() 和 load() 方法中的类 A 是否需要显式地遍历 map 和 multimap 容器,显式地存储/加载它们的键:值对?例如像这样的东西:

void A::store(const char* filename){

std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);

std::map< std::string, B >::iterator it;

BMap.size();
oa << BMap.size();
for( it = BMap.begin(); it != BMap.end(); it++ ){
oa << it->first;
oa << it->second;
}

//similar for strMultimap
}

我假设我不需要这样做,但不确定。

3) 假设类 B 只有显示的两个数据成员,它是否需要显式包含默认构造函数? (与隐式默认构造函数相反)

4) B 是否需要覆盖比较运算符“>”?我认为它不会,因为这是一个非常简单的类。

最后,对于我未能涵盖的任何其他评论,我们将不胜感激!

我上述问题的示例代码:

//includes ommitted

int main() {

std::string file("test.dat");

A * pA = new A;

pA->store(file.c_str());
pA->fillMaps();
//release data
pA->load(file.c_str());

return 0;
}

//includes ommitted

class A
{
friend class boost::serialization::access;

public:

std::map< std::string, B > BMap;
std::multimap< std::string, std::string > strMultimap;

template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & BMap;
ar & strMultimap;
}

void store(const char* filename){

std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
oa << this;
}

void load(const char* filename){

std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
ia >> this;

}

void fillMaps(){

//code to allocate B objects and put them in BMap and fill strMultimap with whatever number of key:value pairs

}

class B
{
friend class boost::serialization::access;

public:

std::string str;
unsigned int num;

B::B(void)
: str("a string")
, num(7)
{
}

template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & str;
ar & num;
}
}

最佳答案

1) 类 B 不需要流运算符,但它确实需要一个 serialize() 方法。我不得不用 BOOST_SERIALIZATION_NVP 包装序列化(名称值对)宏:

ar & BOOST_SERIALIZATION_NVP(someNamedValue); // use this macro for everything you want to name

可能有一种方法可以避免命名您的 map ,但我不知道那是怎么做到的。

2) 不,A 类不需要特定于 map 的序列化代码。只要确保你包括<boost/serialization/map.hpp> .

3) 隐式默认构造函数应该没问题。如果 a) 您已经提供了一个非默认构造函数或 b) 您想要更改默认构造函数的行为,您只需要一个显式默认构造函数。

4) 不需要运算符 < :)

下面是一些编译过的示例代码,但我还没有运行:

#include <boost/serialization/map.hpp>

struct A
{
struct B
{
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
}
};
typedef std::map<int, SomeClass> MyMap;
MyMap myMap;

template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & BOOST_SERIALIZATION_NVP(myMap);
}
};

关于c++ - 包含 Map(具有对象值)和 Multimap(具有 std::string 值)的对象的 boost 序列化:需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1676781/

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