2010-08-13 74 views
2

是否有任何結構或類或容器,我可以用它來存儲可串行化的異​​構項目。例如說,我有一個int,float和另一個類對象。我想在運行時將它們全部存儲在特定的容器中,並通過類傳遞它。 C++是否給出了這樣的選項。類或容器來存儲異構項目在C++

回答

5

您可以使用vectorof boost::variant,例如,

#include <boost/serialization/vector.hpp> 
#include <boost/serialization/variant.hpp> 
// note: the above are serializable variants of 
// #include <vector> 
// #include <boost/variant.hpp> 
#include <fstream> 
#include <iostream> 
#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <algorithm> 
#include <iterator> 

struct Point { 
    float x, y; 
    Point(float x_, float y_) : x(x_), y(y_) {} 
    Point() : x(0), y(0) {} 

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

std::ostream& operator<< (std::ostream& o, const Point& p) { 
    return o << "{x:" << p.x << ", y:" << p.y << "}"; 
} 

int main() { 
    std::vector<boost::variant<int, float, Point> > vec; 
    vec.push_back(12345); 
    vec.push_back(0.65432f); 
    vec.push_back(Point(2.5, 6.7)); 

    { 
     std::ofstream f("1.txt"); 
     { 
      boost::archive::text_oarchive serializer(f); 
      serializer << vec; 
     } 
    } 

    { 
     std::ifstream f("1.txt"); 
     { 
      std::vector<boost::variant<int, float, Point> > result; 
      boost::archive::text_iarchive deserializer(f); 
      deserializer >> result; 

      std::copy(result.begin(), result.end(), 
         std::ostream_iterator<boost::variant<int, float, Point> >(std::cout, "\n")); 

     } 
    } 

    return 0; 
}