Draft: Add type erased wrapper for entities (for discussion only!)
Re. #77 (closed)
On this branch I've whipped up one possible alternative to the std::optional<std::reference_wrapper>>
return type.
The implementation is based on the Type Erasure pattern, but the type erased wrapper does not take ownership of the wrapped object.
Instead, it wraps a std::shared_ptr
to the object and converts it to a std::weak_ptr
for storage.
Each access through the member functions tries to lock the weak_ptr and throws, if the object is no longer accessible.
The wrapper has some interesting properties:
- It can wrap any class with matching function signatures without inheritance
- It checks, if the wrapped object is still accessible
- It is a value type, so it's easy and safe to handle for the user
- It prohibits the user from taking permament shared ownership of the wrapped object
All of the above comes at hefty price though: it adds some runtime overhead and considerable complexity as well as implementation overhead.
The main advantage over just returning a std::weak_ptr
is, that the user cannot take permament shared ownership of the wrapped object.
So the question is, what's the worst that can happen when a user takes permanent shared ownership of say, an IEntity
returned from IEntityRepository
?
In my opinion, the added safety is just not worth the considerable overhead and complexity.
I'd vote for replacing std::optional<std::reference_wrapper>>
by std::weak_ptr
.
Cheers Martin