Hi,
I trying to implement Andrei's Expected<T> from his "Systematic Error Handling in C++" talk
In short: Expected<T> holds either T or exception_ptr holding exception that prevented T's creation. Think of single threaded future<T>.
One of main purposes of this type is efficiency - code that computes T would normally throw in case of errors but instead it returns exception by value which causes Expected<T> to be initiated with exception type instead of actual value of T. Important part is that no throwing happens in library code (making it fast).
As with future<T> throwing of stored exception only happens upon client's request - a call to get() in case of invalid computation (Expected<T>::valid() may be called beforehand to check if computation succeeded).
To the point: Andrei's code uses std::make_exception_ptr() which I assume is std version of boost::copy_exception(). Now problem with copy_exception() is that it actually throws! So the whole idea of not throwing is gone by the fact that I don't know how to transform (const Exception&) into boost::exception_ptr (without throwing via copy_exception()).
How does std::make_exception_ptr() work (as I assume it does not throw & return current_exception() as boost::copy_exception does)? Any suggestions welcome.
Cheers.