gpt4 book ai didi

c++ - 如何避免包含需要 BOOST 序列化的每个类的 header ?

转载 作者:行者123 更新时间:2023-11-30 03:07:54 25 4
gpt4 key购买 nike

我有以下情况(简化):

嗯:

#include <boost/serialisation/serialisation.hpp>
class B;
using namespace std; using namespace boost;
class A {
B *b;
template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & b; }
};

b.h:

#include <boost/serialisation/serialisation.hpp>
class C;
using namespace std; using namespace boost;
class B {
C *c;
template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & c; }
};

c.h:

#include <boost/serialisation/serialisation.hpp>
using namespace std; using namespace boost;
class C {
int somevar;
template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & somevar; }
};

主.cxx:

#include <boost/archive/text_oarchive.hpp>
#include <fstream>
#include "a.h"
#include "b.h"
#include "c.h"
using namespace std; using namespace boost;

int main() {
A a; // Create the object

ofstream ofs("save");
archive::text_oarchive oa(ofs);

oa << a; // Save the object

return 0;
}

现在,问题是我必须在保存函数中包含我想要序列化的所有类的头文件(在本例中就在 main 中)。这样做的问题是,类的数量远远超过三个,而且要复杂得多,导致此时出现编译瓶颈。

我最近才开始使用 boost 序列化,但我查看了文档并在 google 和此处进行了搜索,所以我想我错过了一些明显的东西。

是否有人对此有解决方案,只需要包含“a.h”而不是“b.h”、“c.h”等?

编辑:如果我注释掉 #include "b.h"和 "c.h"行,这有望成为编译错误的关键部分:

main.cxx:17:1:   instantiated from here
/usr/include/boost/type_traits/is_abstract.hpp:72:4: error: incomplete type ‘B’ not allowed

最佳答案

我认为您可以使用显式实例化,然后在 .cpp 文件中定义序列化成员函数。然后 a.cpp 可以根据需要包含 b.h 和 c.h,而 a.h 的用户不再需要这样做。

查看 pimpl-idiom 示例 http://www.boost.org/doc/libs/1_46_1/libs/serialization/example/demo_pimpl_A.hpp (标题)和 http://www.boost.org/doc/libs/1_46_1/libs/serialization/example/demo_pimpl_A.cpp (源文件)了解如何做到这一点。

关于c++ - 如何避免包含需要 BOOST 序列化的每个类的 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527793/

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