2016-01-20 16 views
5

boost::ptr_vector örneğini hububat kullanarak serileştirmek mümkün mü? Öyleyse nasıl?Nasıl bir boost serileştirilir :: ptr_vector tahıl kullanarak?

+2

'ptr_vector' ile yakından tanıdık değilim, ancak aslında' std :: vector 'adlı sargıya benziyor. tahıl ham işaretçileri desteklemez, bu yüzden olası bir "ptr_vector" serisini hububat veya önemli bir geçici çözümde önemli değişiklikler olmadan serileştirmenin mümkün olmadığını düşünüyorum. – Azoth

cevap

3

Bu kesinlikle mümkündür. Böyle arşiv ve işaretçi türüne dış save() ve load() şablon işlevleri oluşturabilirsiniz:

#include <iostream> 
#include <sstream> 
#include <boost/ptr_container/ptr_vector.hpp> 
#include <cereal/archives/binary.hpp> 
#include <cereal/types/string.hpp> 

// Sample serializable object. 
struct MyRecord { 
    std::string s_; 

    MyRecord(const std::string s = std::string()) 
     : s_(s) { 
    } 

    template <class Archive> 
    void serialize(Archive& ar) { 
     ar(s_); 
    } 
}; 

// External save function for boost::ptr_vector<T>. 
template<class Archive, class T> 
void save(Archive& ar, const boost::ptr_vector<T>& pv) { 
    ar(pv.size()); 
    for (const auto& element : pv) 
     ar(element); 
} 

// External load function for boost::ptr_vector<T>. 
template<class Archive, class T> 
void load(Archive& ar, boost::ptr_vector<T>& pv) { 
    size_t n; 
    ar(n); 

    pv.reserve(n); 
    for (size_t i = 0; i < n; ++i) { 
     pv.push_back(new T); 
     ar(pv.back()); 
    } 
} 

int main() { 
    // Serialize a boost::ptr_vector to a buffer. 
    std::ostringstream os; 
    { 
     boost::ptr_vector<MyRecord> saved; 
     saved.push_back(new MyRecord("how")); 
     saved.push_back(new MyRecord("now")); 
     saved.push_back(new MyRecord("brown")); 
     saved.push_back(new MyRecord("cow")); 

     cereal::BinaryOutputArchive oa(os); 
     oa(saved); 
    } 

    // Serialize from the buffer. 
    boost::ptr_vector<MyRecord> loaded; 
    { 
     std::istringstream is(os.str()); 
     cereal::BinaryInputArchive ia(is); 
     ia(loaded); 
    } 

    for (const auto& element : loaded) 
     std::cout << element.s_ << '\n'; 

    return 0; 
} 

Bu varsayılan-constructible ve şimdiden tek tek seri hale getirilebilir herhangi içerdiği tipiyle çalışmalıdır.

+0

.... ve "save" ve "load" için aşırı yüklenmeler _associated namespace_ (ADF) 'de bulunabilir. Bu sürümün yükte oldukça komik bir inşaat semantiğine sahip olduğunu ekleyebilirim. "Tamam", çünkü ptr_vectors zaten – sehe

+0

@sehe gibi taklit elemanlar alamıyor, komik yük semantikleri ile bunun daha verimli bir şekilde yapılabileceği anlamına mı geliyor? –

+0

Aslında, hayır, iyi görünüyor. – sehe

İlgili konular