Support serialization as another type without casting

This adds a READWRITEAS(type, obj) macro which serializes obj as if it
were casted to (const type&) when const, and to (type&) when non-const.

This makes it usable in serialization code that uses a single
implementation for both serialization and deserializing, which doesn't
know the constness of the object involved.
This commit is contained in:
Pieter Wuille
2017-07-07 16:06:56 -07:00
parent 8ee5c7b747
commit 818dc74ba2
7 changed files with 13 additions and 8 deletions

View File

@@ -148,7 +148,12 @@ enum
SER_GETHASH = (1 << 2),
};
#define READWRITE(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__))
//! Convert the reference base type to X, without changing constness or reference type.
template<typename X> X& ReadWriteAsHelper(X& x) { return x; }
template<typename X> const X& ReadWriteAsHelper(const X& x) { return x; }
#define READWRITE(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__))
#define READWRITEAS(type, obj) (::SerReadWriteMany(s, ser_action, ReadWriteAsHelper<type>(obj)))
/**
* Implement three methods for serializable objects. These are actually wrappers over