2014-03-05 3 views
1

저는 C++을 처음 접했고 어떻게 포인터와 템플릿을 공유하는 구조체를 직렬화합니까? 다음은 샘플 코드입니다.공유 포인터 및 템플릿을 사용하여 serilaization을 향상 시키십시오.

#pragma once 

#include <boost/serialization/access.hpp> 
#include <boost\serialization\string.hpp> 
#include <boost\serialization\shared_ptr.hpp> 

//Mydata.hpp file 

namespace mydata 
{ 

struct MyData 
{ 
    std::string name; 
    std::string type; 
    std::shared_ptr<MyInfo> myref; 

    private: 
    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive &ar, const unsigned int vs) 
    { 
     ar & name; 
     ar & type; 
     ar & myref; 
    } 
} 
} 

어떻게 공유 포인터에 해당 Mydata.cpp 파일을 구현합니까?

답변

0

그 헤더는 boost::shared_ptr에 대한 지원을 포함, 그래서 다음 작품 :

#include <boost/serialization/access.hpp> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/shared_ptr.hpp> 
#include <boost/archive/text_oarchive.hpp> 
#include <boost/smart_ptr/make_shared.hpp> 

namespace mydata 
{ 
    struct MyInfo 
    { 
     std::string info = "extra info"; 

     MyInfo(std::string info) : info(std::move(info)) {} 

     friend class boost::serialization::access; 
     template<class Archive> 
      void serialize(Archive &ar, const unsigned int /*version*/) 
      { 
       ar & info; 
      } 
    }; 

    struct MyData 
    { 
     std::string name; 
     std::string type; 
     boost::shared_ptr<MyInfo> myref; 

     private: 
     friend class boost::serialization::access; 
     template<class Archive> 
      void serialize(Archive &ar, const unsigned int /*version*/) 
      { 
       ar & name; 
       ar & type; 
       ar & myref; 
      } 
    }; 
} 

int main() 
{ 

    using namespace mydata; 
    MyData data { "this is a name", "this is a type", boost::make_shared<MyInfo>("this is info") }; 

    boost::archive::text_oarchive oa(std::cout); 
    oa << data; 
} 

는보기 그것을 Live On Coliru

+0

코드 위 내가 갈 항상 – sia

+0

[템플릿 정의 파일 Mydata.cpp에서 그것을 구현해야 할 헤더로] (http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file/495056#495056). 그렇지 않으면, 그것은 당신의 선택입니다. 직렬화 논리를 바로 원하지 않는다면 [비 침투 직렬화 적응] (http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/tutorial.html##)을 참조하십시오. nonintrusiveversion) 기존 (공개 또는 제 3 자) 클래스에 멤버를 추가 할 필요가없는 – sehe