我有一个类Ptr
它包装的指针。 这个指针可以处理的结构,例如Ptr<A>
其中A
可以是一个复杂的结构或原语,如Ptr<double>
。 我想指定save
和load
的功能Ptr
serilaization为这两种情况下工作。
在这里,我试图去模仿一个简单的例子:
struct A {
A(int aa) : a(aa) {}
int a;
template<class Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & BOOST_SERIALIZATION_NVP(a);
}
};
template <typename T>
struct Ptr {
Ptr() : m_elem(0) {}
Ptr(const T* elem) { m_elem = (elem ? new T(*elem) : 0); };
const T& operator*() const { return *m_elem; };
T& operator*() { return *m_elem; };
const T* operator->() const { return m_elem;};
T* operator->() { return m_elem;};
// [...] other ctor, copy, del, etc...
T* m_elem;
};
namespace boost { namespace serialization {
template<class Archive, class T>
void save(Archive & ar, const Ptr<T> &ptr, const unsigned int version) {
T* base_pointer = (ptr.m_elem);
ar & boost::serialization::make_nvp("Ptr", base_pointer);
}
template<class Archive, class T>
void load(Archive & ar, Ptr<T> &ptr, const unsigned int version) {
T *base_pointer;
ar & boost::serialization::make_nvp("Ptr", base_pointer);
ptr.m_elem = base_pointer;
}
template<class Archive, class T>
void serialize(Archive & ar, Ptr<T> &ptr, const unsigned int version)
{
boost::serialization::split_free(ar, ptr, version);
}
}} // end namespace
int main() {
Ptr<A> p1(new A(4));
std::cout << p1.m_elem->a << std::endl;
Ptr<double> p2(new double(2.0));
std::cout << *(p2.m_elem) << std::endl;
// The serialization for Ptr<A> seems to work
std::ostringstream archive_ostream;
boost::archive::xml_oarchive oa(archive_ostream);
oa << BOOST_SERIALIZATION_NVP(p1);
std::cout << archive_ostream.str() << std::endl;
// Serialization for Ptr<double> does not compile
/*
std::ostringstream archive_ostream2;
boost::archive::xml_oarchive oa2(archive_ostream2);
oa2 << BOOST_SERIALIZATION_NVP(p2);
std::cout << archive_ostream2.str() << std::endl;
*/
}
活生生的例子
正如你所看到的,对于系列化Ptr<A>
似乎工作(还是我不知道这是否是足够安全的)。 然而,序列化Ptr<double>
不进行编译。
错误输出:
main.cpp中:在“无效的boost ::系列化的实例::保存(归档&,常量PTR&,无符号整型)[带有归档=升压::归档:: xml_oarchive; T = A]':
/usr/local/include/boost/serialization/split_free.hpp:45:13:
从“静态无效的boost ::系列化:: free_saver需要::调用(归档&,常量T&,无符号整型)[带有归档=升压::归档:: xml_oarchive; T = PTR]”/usr/local/include/boost/serialization/split_free.hpp:74:18:
从“无效的boost ::系列化:: split_free需要(归档&,T&,无符号整型)[带有归档=升压::归档:: xml_oarchive; T = PTR]”main.cpp中:57:34:从“无效的boost ::系列化::序列化所需的(归档&,PTR&,无符号整型)[带有归档=升压::归档:: xml_oarchive; T = A]”
因此,我要寻找一个正确的Ptr
系列化!