Boost logo

Boost :

From: Emil Dotchevski (emildotchevski_at_[hidden])
Date: 2020-05-31 18:22:52

On Sun, May 31, 2020 at 10:32 AM Rainer Deyke via Boost <
boost_at_[hidden]> wrote:
> On 31.05.20 18:03, Christian Mazakas via Boost wrote:
> >> The use of such a low-level API would look something like this:
> >
> > Hmm, I'm failing to see the overwhelming value in exposing these
> > of the API.
> Here is one use case for some kind of low-level access to error objects
> without going through lambdas (although it would have a different form
> than the one used by Bjorn). Suppose I have an error type that may or
> may not be annotated with a file name, an IP address, or a user name,
> individually or in any combination. For each of these annotations, I
> want to handle it the same whenever it is present, regardless of the
> others. Without some sort of direct access to error objects, the code
> for this would look something like this:
> return leaf::try_handle_some(
> some_try_block,
> [](leaf::match<my_error>,
> leaf::e_file_name fname,
> my::e_user_name uname,
> my::ip_address ip) {
> handle_filename(fname);
> handle_user_name(uname);
> handle_ip(ip);
> return handle_error();
> },
> <deleted long list of lambdas

No, you'd simply do:

return leaf::try_handle_some(
   [](leaf::match<my_error, my_error::something>,
      leaf::e_file_name const * fname,
      my::e_user_name const * uname,
      my::ip_address const * ip) {
     if( fname )
     if( uname )
     if( ip )
     return handle_error();
   } );

When you take an argument by const & or by value, LEAF does the ifs for you
before calling your function (once it determines that all of its arguments
are available). If an argument is taken by const *, and the value is not
available, LEAF will still call the function, passing null for that

Boost list run by bdawes at, gregod at, cpdaniel at, john at