#include #include namespace hasher { template class oarchive : public boost::archive::detail::common_oarchive< oarchive > { friend class boost::archive::save_access; public: oarchive() {} std::size_t get() { return static_cast(h); } template void save_override(const T& data, long /* version */) { boost::archive::save(*this->This(), data); } void save(int value) { h.append(std::addressof(value), sizeof(value)); } // Ignore these void save_override(const boost::archive::version_type, int) {} void save_override(const boost::archive::object_id_type, int) {} void save_override(const boost::archive::object_reference_type, int) {} void save_override(const boost::archive::class_id_type, int) {} void save_override(const boost::archive::class_id_optional_type, int) {} void save_override(const boost::archive::class_id_reference_type, int) {} void save_override(const boost::archive::tracking_type, int) {} void save_override(const boost::archive::class_name_type&, int) {} private: Hasher h; }; class fnv1a { std::intmax_t state_ = 14695981039346656037u; public: void append(void const* key, std::size_t len) noexcept { unsigned char const* p = static_cast(key); unsigned char const* const e = p + len; for (; p < e; ++p) state_ = (state_ ^ *p) * 1099511628211u; } explicit operator std::size_t() noexcept { return state_; } }; } // namespace hasher #include namespace boost { namespace serialization { template void save(Archive& archive, const std::pair& data, const unsigned int /* version */) { archive << data.first; archive << data.second; } template void serialize(Archive& archive, std::pair& data, const unsigned int version) { boost::serialization::split_free(archive, data, version); } } // namespace serialization } // namespace boost #include #include class X { std::pair alpha; public: X() : alpha{1999, 1} { } template void serialize(T& archive, const unsigned int) { // archive & alpha; } template void serialize(hasher::oarchive& archive, const unsigned int) { archive & alpha; } }; #include #include int main(int argc, char *argv[]) { X x; hasher::oarchive archive; archive << x; // Succeeds archive << 42 << x; // Fails std::size_t result = archive.get(); std::cout << result << std::endl; return 0; }