Worked example: Custom domain (the long way)

Here follows a longer worked example of use of Experimental Outcome. It presents the same sample program I sent to the San Diego 2018 WG21 standards meeting after I was asked by the committee to demonstrate how P1095 implements P0709 in a working code example they could study and discuss.

We will walk through this worked example, step by step, explaining how each part works in detail. This will help you implement your own code based on Experimental Outcome.

Most users will not need this level of customisation, and for them the preceding quick and easy approach will be much easier.

You may find it useful to open now in a separate browser tab the reference API documentation for proposed <system_error2> at https://ned14.github.io/status-code/ (scroll half way down). The references in the comments to P1028 are to P1028 SG14 status_code and standard error object for P0709 Zero-overhead deterministic exceptions, which is the WG21 proposal paper for potential <system_error2>.

Goal of this section

We are going to define a simple custom code domain which defines that the status code’s payload will consist of a POSIX error code, and the __FILE__ and __LINE__ where the failure occurred. This custom status code will have an implicit conversion to type erased error defined, which dynamically allocates memory for the original status code, and outputs an error which manages that dynamic allocation, indirecting all queries etc to the erased custom status code type such that the error instance quacks as if just like the original. This demonstrates that error could just as equally convey a std::exception_ptr, for example, or indeed manage the lifetime of any pointer.