Prev Up HomeNext

TRY operations

In the implementation of function print_half we have seen the usage of the macro BOOST_OUTCOME_TRYV(expr)/BOOST_OUTCOME_TRY(expr) :

BOOST_OUTCOME_TRY (i, BigInt::fromString(text));

The BOOST_OUTCOME_TRY macro uses C macro overloading to select between two implementations based on the number of input parameters. If there is exactly one input parameter i.e. without the i, the control statement is roughly equivalent to:

auto&& __result = BigInt::fromString(text);
if (!__result)
  return __result.as_failure();

Where __result is a compile time generated unique name. This single argument form is equivalent to BOOST_OUTCOME_TRYV(expr), incidentally.

If there are between two and eight parameters, this control statement is roughly equivalent to:

auto&& __result = BigInt::fromString(text);
if (!__result)
  return __result.as_failure();
auto&& i = __result.value();

So here i as the first C macro parameter is set to the value of any successful result.

C macro overloads are provided for up to eight arguments. To prevent the confounding of the C preprocessor by commas in template specifications causing more than eight arguments appearing to the C preprocessor, you should consider wrapping the second argument in brackets.


Compiler-specific extension: BOOST_OUTCOME_TRYX

note

This macro makes use of a proprietary extension in GCC and clang, and is not portable. The macro is not made available on unsupported compilers, so you can test for its presence using #ifdef BOOST_OUTCOME_TRYX.

GCC and Clang provide an extension to C++ known as statement expressions. These make it possible to use a more convenient macro: BOOST_OUTCOME_TRYX, which is an expression. With the above macro, the above declaration of variable i can be rewritten to:

int i = BOOST_OUTCOME_TRYX (BigInt::fromString(text));

This has an advantage that you can use it any place where you can put an expression, e.g., in “simple initialization”:

if (int i = BOOST_OUTCOME_TRYX(BigInt::fromString(text)))
  use_a_non_zero_int(i);

or in as a subexpression of a bigger full expression:

int ans = BOOST_OUTCOME_TRYX(BigInt::fromString("1")) + BOOST_OUTCOME_TRYX(BigInt::fromString("2"));

Last revised: February 08, 2019 at 22:18:08 UTC


Prev Up HomeNext