C Results
The C macro API header <boost/outcome/experimental/result.h> has some macros for working with any kind of Result:
- BOOST_OUTCOME_C_DECLARE_RESULT(ident, T, E)
- Declares to C a basic_resulttype uniquely identified byident.Tis available at the member variable.value, andEis available at the member variable.error. If you call this from within C++, make SURE it is not within aextern "C"block!
- BOOST_OUTCOME_C_RESULT(ident)
- A reference to a previously declared resulttype with uniqueident.
- BOOST_OUTCOME_C_RESULT_HAS_VALUE(r)
- Evaluates to 1 (true) if the input resulthas a value.
- BOOST_OUTCOME_C_RESULT_HAS_ERROR(r)
- Evaluates to 1 (true) if the input resulthas an error.
- BOOST_OUTCOME_C_RESULT_ERROR_IS_ERRNO(r)
- Evaluates to 1 (true) if the input result's error value is a code in the POSIXerrnodomain.
The above let you work, somewhat awkwardly, with any C-compatible
basic_result<T, E>. basic_result<T, E> is trivially copyable and
standard layout if its T and E are both so, and it has the C layout:
struct cxx_result_##ident
{
  union
  {
    T value;
    E error;
  };
  unsigned flags;
};
Note that this layout is different to that of BOOST_OUTCOME_C_DECLARE_STATUS_CODE
as the C++ result has a different layout if E is a status code.



