|
Boost : |
From: Bjorn Reese (breese_at_[hidden])
Date: 2020-05-31 13:50:43
On 2020-05-31 01:18, Emil Dotchevski via Boost wrote:
>> The LEAF handling is reminiscient of a variant visitor, but with the
>> variants we can use index() and std::get<T> in a switch statement
>> instead of visitation. I would like to see something similar for LEAF
>> error contexts.
>
> The difficulty with that is, context<E...> requires a list of types so it
> knows what to put in the tuple. In other words, before you are able to say
> ctx.get<T>(), you must have included that T in the types used to
> instantiate context<E...>, and if you didn't, you'd always get a null.
> Worse, if you missed to include a T in the list of types, and an
> error-reporting function attempts to communicate a T, it'll get discarded
> (no storage for it). That's why LEAF deduces the E... type list from the
> types that error handlers take as arguments. This way, if a T is discarded,
> it means no error handlers needed it, and so it'd be wasteful to spend
> cycles transporting it.
I made a typo above. I meant to say std::get<I>.
I am asking for a low-level API, not a bullet-proof API. If the latter
is needed, then your existing pattern matching solution works just fine.
The use of such a low-level API would look something like this:
leaf::context<E0, E1> ctx;
ctx.activate(); // I would like to avoid this though
auto ret = foo();
if (!ret)
{
switch (ctx.index(ret.error()))
{
case 0: // E0
handle_E0(ctx.get<0>(ret.error()); break;
case 1: // E1
handle_E1(ctx.get<1>(ret.error()); break;
default: // Unknown error type
panic(); break;
}
}
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk