template<typename T = void>
stim::result class

A result type for library operations which may fail, returning an error message.

Template parameters
T The 'success' value type.

Public types

using error_type = string_view
The error type stored internally when the operation fails.
using value_type = T
The value type stored when the operation was successful.

Constructors, destructors, conversion operators

template<typename U>
operator result<U>() const noexcept
Converts this result object into one representing a different but compatible value_type.
result() defaulted noexcept
Default-constructs an 'error' result with an empty string for the error message.
result(const result&) defaulted noexcept
Copy constructor.
result(result&&) defaulted noexcept
Move constructor.
result(std::true_type) noexcept
Default-constructs a 'success' result.
result(const value_type& val, std::true_type) noexcept
Constructs a 'success' result.
result(value_type&& val, std::true_type) noexcept
Constructs a 'success' result.
result(const value_type& val) noexcept
Constructs a 'success' result.
result(value_type&& val) noexcept
Constructs a 'success' result.
result(const error_type& err, std::false_type) noexcept
Constructs an 'error' result.
result(std::false_type) noexcept
Default-constructs an 'error' result with an empty string for the error message.
result(const error_type& err) noexcept
Constructs an 'error' result.
result(bool success) explicit noexcept
Constructs a result from a boolean, default-constructing the value/error accordingly.
~result() defaulted noexcept
Destructor.

Public functions

auto operator=(const result&) -> result& defaulted noexcept
Copy-assignment operator.
auto operator=(result&&) -> result& defaulted noexcept
Move-assignment operator.

Error result values

auto error() const -> const error_type& noexcept
Returns the error message describing why the operation failed.
operator const error_type&() const explicit noexcept
Returns the error message describing why the operation failed.

Result checks

auto ok() const -> bool noexcept
Returns true if the operation was a success.
operator bool() const explicit noexcept
Returns true if the operation was a success.
auto operator!() const -> bool noexcept
Returns true if the operation failed.

Successful result values

operator const value_type&&() const && explicit noexcept
Returns the internal 'success' value.
operator value_type&() & explicit noexcept
Returns the internal 'success' value.
operator value_type&() const & explicit noexcept
Returns the internal 'success' value.
operator value_type&&() && explicit noexcept
Returns the internal 'success' value.
auto operator*() & -> value_type& noexcept
Returns the internal 'success' value.
auto operator*() const & -> const value_type& noexcept
Returns the internal 'success' value.
auto operator*() && -> value_type&& noexcept
Returns the internal 'success' value.
auto operator*() const && -> const value_type&& noexcept
Returns the internal 'success' value.
auto operator->() -> value_type* noexcept
Returns the internal 'success' value.
auto operator->() const -> const value_type* noexcept
Returns the internal 'success' value.
auto value() & -> value_type& noexcept
Returns the internal 'success' value.
auto value() const & -> const value_type& noexcept
Returns the internal 'success' value.
auto value() && -> value_type&& noexcept
Returns the internal 'success' value.
auto value() const && -> const value_type&& noexcept
Returns the internal 'success' value.

Typedef documentation

template<typename T>
using stim::result<T>::error_type = string_view

The error type stored internally when the operation fails.

Function documentation

template<typename T>
template<typename U>
stim::result<T>::operator result<U>() const noexcept

Converts this result object into one representing a different but compatible value_type.

Error messages remain unchanged after converting so this conversion operator may be used to reduce a series of operations from more to less specialized, deferring error handling until the end:

stim::result<stim::object_handle> obj{ "unknown object type"_ssv };
switch (sim_object_type_id)
{
    case 0:
    {
        stim::rigid_body_description desc{ /* ... */ };
        obj = sim.add_object(desc); // converts from result<rigid_body_handle>
        break;
    }
    case 1:
    {
        stim::soft_body_description desc{ /* ... */ };
        obj = sim.add_object(desc); // converts from result<soft_body_handle>
        break;
    }
    case 2:
    {
        stim::volumetric_body_description desc{ /* ... */ };
        obj = sim.add_object(desc); // converts from result<volumetric_body_handle>
        break;
    }
}
if (!obj)
{
    std::cerr << obj.error().data() << "\n";
    return;
}

// can be reduced further to result<> if the actual value is irrelevant
stim::result<> obj_result = obj;
assert(obj_result);

template<typename T>
stim::result<T>::result(const result&) defaulted noexcept

Copy constructor.

template<typename T>
stim::result<T>::result(result&&) defaulted noexcept

Move constructor.

template<typename T>
stim::result<T>::result(std::true_type) noexcept

Default-constructs a 'success' result.

template<typename T>
stim::result<T>::result(const value_type& val, std::true_type) noexcept

Constructs a 'success' result.

template<typename T>
stim::result<T>::result(value_type&& val, std::true_type) noexcept

Constructs a 'success' result.

template<typename T>
stim::result<T>::result(const value_type& val) noexcept

Constructs a 'success' result.

template<typename T>
stim::result<T>::result(value_type&& val) noexcept

Constructs a 'success' result.

template<typename T>
stim::result<T>::result(const error_type& err) noexcept

Constructs an 'error' result.

template<typename T>
stim::result<T>::result(bool success) explicit noexcept

Constructs a result from a boolean, default-constructing the value/error accordingly.

template<typename T>
result& stim::result<T>::operator=(const result&) defaulted noexcept

Copy-assignment operator.

template<typename T>
result& stim::result<T>::operator=(result&&) defaulted noexcept

Move-assignment operator.

template<typename T>
stim::result<T>::operator const error_type&() const explicit noexcept

Returns the error message describing why the operation failed.

template<typename T>
stim::result<T>::operator const value_type&&() const && explicit noexcept

Returns the internal 'success' value.

template<typename T>
stim::result<T>::operator value_type&() & explicit noexcept

Returns the internal 'success' value.

template<typename T>
stim::result<T>::operator value_type&() const & explicit noexcept

Returns the internal 'success' value.

template<typename T>
stim::result<T>::operator value_type&&() && explicit noexcept

Returns the internal 'success' value.

template<typename T>
value_type* stim::result<T>::operator->() noexcept

Returns the internal 'success' value.

template<typename T>
const value_type* stim::result<T>::operator->() const noexcept

Returns the internal 'success' value.