Bill Lear wrote:
On Friday, March 9, 2007 at 11:47:21 (-0800) Robert Ramey writes:
Second I would make this a "helper class" . Your special "Lear Archive" would be derived from an existing archive and the helper class using multiple inheritance. Look at the implemenation of shared_ptr checked into the HEADof CVS to see how to do this. ...
I checked out the head of CVS, but did not see anything relating to a helper class in shared_ptr.hpp. Not sure if I'm looking in the right place. This is how I checked it out:
% cvs -z3 -d:pserver:anonymous@boost.cvs.sourceforge.net:/cvsroot/boost checkout boost
Its in boost/archive/binary_iarchive.hpp You don't have to check out, you can always use the web browser interface to browser though the library. Its much better in that it gives a "3 dimensional" view so you can see changes that have been made and differences between versions. The relevant section looks like: 65 class binary_iarchive : 66 public binary_iarchive_impl< 67 boost::archive::binary_iarchive, 68 std::istream::char_type, 69 std::istream::traits_type 70 >, 71 public detail::shared_ptr_helper 72 { 73 public: ... The shared_ptr_helper creates and destroy an extra tracking object that shared_ptr requires. This is similar to your case.
I'm not sure I need to use a cache of strings when saving, in fact, I think not, but I went ahead and more-or-less followed your instructions.
lol - well good luck with that!!!. Actually, now that I think about it. I guess we only need the cache of strings on input.
I can't seem to get this to compile, but it's getting closer.
The complete code is below my sig.
The compiler (gcc) complains:
error: 'class boost::archive::text_iarchive' has no member named 'cache' error: 'class boost::archive::text_oarchive' has no member named 'cache'
try changing
class ll_text_iarchive: public text_iarchive_impl
, public ll_cache { public: ll_text_iarchive(std::istream& is, unsigned int flags = 0) : text_iarchive_impl (is, flags) {} };
to
class ll_text_iarchive: public text_iarchive_impl
, public ll_cache { public: ll_text_iarchive(std::istream& is, unsigned int flags = 0) : text_iarchive_impl (is, flags) {} };
Note that the argumetn to text_iarchive_impl should be the MOST DERIVED class
Also, for some reason, I can't use this idiom:
ar << ll_string(s);
In fact, this won't work, either:
ar << string("foo");
My guess is that is the is the "const" trap which using is_wrapper will get around. But this only works in 1.35. So for now do one of the following: use & instead of << or use a const_cast which will be somewhat complex. The "const" trap is also explained in the documentation under the section "rationale"
Finally, I really have no idea how to use the reset_object_address() method. I looked through the boost code, but couldn't decipher it.
Did you find anything about it in the documentation?
Any help appreciated.
You're welcome. Robert Ramey