There is an existing expected<T,E>
class which provides these typedefs
and operators
:
value_type = T
operator *(): expected<T,E>& -> value_type&
const expected<T,E>& -> const value_type&
expected<T,E>&& -> value_type&&
const expected<T,E>&& -> const value_type&&
Now I'm writing a function like this:
template <typename E>
/*type*/ Unwrap(E&& e)
{
return e.has_value() ? /*what*/
: throw e.error();
}
what should I put in the comment block?
I've tried auto&&
and *e
, it received an excepted&&
but returned a value_type&
.
I've also tried std::forward
, but it even couldn't be compiled.
how should I do?
CodePudding user response:
You can use decltype(auto)
as the return type:
#include <utility>
template<typename E>
decltype(auto) Unwrap(E&& e) {
return e.has_value() ? *std::forward<E>(e)
: throw e.error();
}