demo_auto_ptr.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 136 行
CPP
136 行
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8// demo_auto_ptr.cpp// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com . // Use, modification and distribution is subject to the Boost Software// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)#include <list>#include <memory>#include <fstream>#include <string>#include <cstdio> // remove, std::autoptr inteface wrong in dinkumware#include <boost/config.hpp>#if defined(BOOST_NO_STDC_NAMESPACE)namespace std{ using ::remove;}#endif#include <boost/archive/tmpdir.hpp>#include <boost/archive/text_oarchive.hpp>#include <boost/archive/text_iarchive.hpp>#include <boost/serialization/split_free.hpp>namespace boost { namespace serialization {/////////////////////////////////////////////////////////////// implement serialization for auto_ptr<T>// note: this must be added to the boost namespace in order to// be called by the librarytemplate<class Archive, class T>inline void save( Archive & ar, const std::auto_ptr<T> &t, const unsigned int file_version){ // only the raw pointer has to be saved // the ref count is rebuilt automatically on load const T * const tx = t.get(); ar << tx;}template<class Archive, class T>inline void load( Archive & ar, std::auto_ptr<T> &t, const unsigned int file_version){ T *pTarget; ar >> pTarget; // note that the reset automagically maintains the reference count #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) t.release(); t = std::auto_ptr<T>(pTarget); #else t.reset(pTarget); #endif}// split non-intrusive serialization function member into separate// non intrusive save/load member functionstemplate<class Archive, class T>inline void serialize( Archive & ar, std::auto_ptr<T> &t, const unsigned int file_version){ boost::serialization::split_free(ar, t, file_version);}} // namespace serialization} // namespace boost/////////////////////////////////////////////////////////////// test auto_ptr serializationclass A{private: friend class boost::serialization::access; int x; template<class Archive> void serialize(Archive &ar, const unsigned int /* file_version */){ ar & x; }public: A(){} // default constructor ~A(){} // default destructor};void save(const std::auto_ptr<A> & spa, const char *filename){ std::ofstream ofs(filename); boost::archive::text_oarchive oa(ofs); oa << spa;}void load(std::auto_ptr<A> & spa, const char *filename){ // open the archive std::ifstream ifs(filename); boost::archive::text_iarchive ia(ifs); // restore the schedule from the archive ia >> spa;}int main(int argc, char *argv[]){ std::string filename = boost::archive::tmpdir(); filename += "/testfile"; // create a new auto pointer to ta new object of type A std::auto_ptr<A> spa(new A); // serialize it save(spa, filename.c_str()); // reset the auto pointer to NULL // thereby destroying the object of type A // note that the reset automagically maintains the reference count #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) spa.release(); #else spa.reset(); #endif // restore state to one equivalent to the original // creating a new type A object load(spa, filename.c_str()); // obj of type A gets destroyed // as auto_ptr goes out of scope std::remove(filename.c_str()); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?