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 + -
显示快捷键?