gpt4 book ai didi

c++ - 标记枚举 C++ 的非侵入式 Boost 序列化

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:04 24 4
gpt4 key购买 nike

我想序列化结构 A,我可以在其中以非侵入性方式保存枚举表达式的标记名称而不是其整数(无需更改结构 A)。

enum e_fruit {
apple,
banana,
coconut
};

struct A {
e_fruit fruit;
int num;
};

namespace boost { namespace serialization {

template<class Archive>
void serialize(Archive & ar, A &a, const unsigned int version)
{
ar & boost::serialization::make_nvp("FruitType", a.fruit); // this will store an integer
ar & boost::serialization::make_nvp("Number", a.num);
}

}}

我已经尝试在本地向序列化函数引入一个查找表:

template<class Archive>
void serialize(Archive & ar, A &a, const unsigned int version)
{
static const char* const labels[] = { "Apple", "Banana", "Coconut" };
ar & boost::serialization::make_nvp("FruitType", labels[a.fruit]); // this won't work
ar & boost::serialization::make_nvp("Number", a.num);
}

不幸的是我得到了错误:

Error 78 error C2228: left of '.serialize' must have class/struct/union

因为make_nvp的原型(prototype)是

nvp< T > make_nvp(const char * name, T & t){
return nvp< T >(name, t);
}

所以 T 应该是一个推导的模板参数。然后我考虑制作一个包含这些标签的结构,但我必须将其添加到结构 A 中,这是我想要避免的......

那么我们如何才能以最非侵入性的方式实现这一点呢?

最佳答案

我认为您需要将加载与保存分开。这编译,我想知道它是否值得游戏......

struct fruit_serializer
{
e_fruit &a_;
fruit_serializer(e_fruit &a) : a_(a) {}
template<class Archive>
void save(Archive & ar, const unsigned int version) const
{
std::string label = labels[static_cast<int>(a_)];
ar & boost::serialization::make_nvp("label", label);
}
template<class Archive>
void load(Archive & ar, const unsigned int version)
{
std::string label ;
ar & boost::serialization::make_nvp("label", label);
a_ = static_cast<e_fruit>(std::find(labels.begin(), labels.end(), label) - labels.begin());
}
BOOST_SERIALIZATION_SPLIT_MEMBER();
static std::vector<std::string> labels ;
};

std::vector<std::string> fruit_serializer::labels({ "Apple", "Banana", "Coconut" });

template<class Archive>
void serialize(Archive & ar, A &a, const unsigned int version)
{
fruit_serializer a1(a.fruit);
ar & boost::serialization::make_nvp("FruitType", a1);
}

关于c++ - 标记枚举 C++ 的非侵入式 Boost 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30725646/

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