【发布时间】:2014-04-15 19:54:05
【问题描述】:
我想添加能够通过 boost 序列化接口序列化 boost 融合映射的功能。我尝试了以下方法:
#include <iostream>
#include <boost/fusion/container/map.hpp>
#include <boost/fusion/include/map.hpp>
#include <boost/fusion/container/map/map_fwd.hpp>
#include <boost/fusion/include/map_fwd.hpp>
#include <boost/fusion/sequence/intrinsic/at_key.hpp>
#include <boost/fusion/include/at_key.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/archive/text_iarchive.hpp>
struct fieldOne {};
struct fieldTwo {};
typedef boost::fusion::map<
boost::fusion::pair<fieldOne, int>,
boost::fusion::pair<fieldTwo, double>
> tFusionMap;
int main() {
tFusionMap map;
boost::archive::text_iarchive ar(std::cin);
std::cin >> map; /* no compile error */
ar & map; /* compiler error: */
return 0;
}
这给了我编译器错误:
struct boost::fusion::map<boost::fusion::pair<fieldOne, int>,
boost::fusion::pair<fieldTwo, double> >’ has no member named ‘serialize’
所以显然我需要自己实现这个。在网上搜索了一些指导后,我找到了这些答案
Boost fusion serialization of a class using BOOST_FUSION_ADAPT_ADT
How to serialize fusion::vector?
但是,所有这些答案(以及网络上的许多其他答案)都依赖于使用自定义函数调用序列化,例如:
fusion_serialize(ar, m);
但是,我想以我可以调用的方式序列化地图:
ar & m;
这样我就可以在其他模板函数中使用序列化。有没有办法做到这一点?
我已经尝试将它添加到我的源文件中
namespace boost {
namespace serialization {
template<class Archive, typename T, std::size_t num_dims>
void serialize( Archive & ar, T & map, const unsigned int version ) {
fusion_serialize(ar,map);
}
}
}
但是,这太笼统了,因为如果模板不是融合映射,模板将匹配任何类型并生成编译错误。我看不到如何修改上述内容,以便 serialize 函数定义仅适用于 boost::fusion::map 类型。有什么建议吗?
【问题讨论】:
-
template
void serialize(Archive & ar, tFusionMap& m, const unsigned int version) 应该可以工作 -
这仅适用于我的
tFusionMap,但是,我希望序列化适用于所有 fusioan 地图
标签: c++ serialization boost