On 22-01-16 20:50, Robert Ramey wrote:
On 1/22/16 9:55 AM, Bjorn Reese wrote:
On 01/22/2016 05:54 PM, Robert Ramey wrote:
My concern is more that Boost.Serialization imposes a serialization
sequence that is invalid for certain encoding formats. This means that
we have to by-pass Boost.Serialization for the serialization of arrays.
Hmmm - try thinking of the serialization library in a slightly
different way. Think of it as a framework for implementation of
serialization for other types. Then consider the specific types
included in the library as "examples" of how to use the library.
Think of overloading as "customization points".
In that vein, how do you like a "decorating" wrapper that allows you to
override default behaviour:
#include <iostream>
#include
#include
namespace mylib {
template <typename T> using custom_wrapper_traits =
boost::serialization::wrapper_traits;
// primary template transparent relay to underlying type
template <typename T> struct custom_serialize_wrapper :
custom_wrapper_traits {
T &_ref;
custom_serialize_wrapper(T& ref) : _ref(ref) {}
template <typename Ar> void serialize(Ar &ar, unsigned) { ar
&_ref; }
};
// specialization array references
template struct
custom_serialize_wrapper :
custom_wrapper_traits > {
T(&_ref)[N];
custom_serialize_wrapper(T (&ref)[N]) : _ref(ref) {}
template <typename Ar> void serialize(Ar &ar, unsigned) {
for (auto &el : _ref) ar ⪙
}
};
template <typename T> custom_serialize_wrapper<T> make_custom(T
&ref) { return { ref }; }
}
#include
#include
struct X {
int m;
template <typename Ar> void serialize(Ar &ar, unsigned) { ar &m; }
};
int main() {
auto const flags = boost::archive::archive_flags::no_header;
X arr[10] = { X{42}, X{43}, X{44}, X{45}, X{46}, X{47}, X{48},
X{49}, X{50}, X{51}, };
{
// BAD: prefixes length:
boost::archive::text_oarchive oa(std::cout, flags);
oa & arr;
}
{
// this is the behaviour wanted:
boost::archive::text_oarchive oa(std::cout, flags);
oa & arr[0] & arr[1] & arr[2] & arr[3] & arr[4] & arr[5] &
arr[6] & arr[7] & arr[8] & arr[9];
}
{
// same behaviour with custom_wrapper:
boost::archive::text_oarchive oa(std::cout, flags);
oa & mylib::make_custom(arr); // wrapped
}
}
See it Live On Coliru http://coliru.stacked-crooked.com/a/5f2cc73ed973c5c8
Output
10 0 0 42 43 44 45 46 47 48 49 50 51
0 0 42 43 44 45 46 47 48 49 50 51
0 0 42 43 44 45 46 47 48 49 50 51
Seth