diff --git a/include/cpp2util.h b/include/cpp2util.h index cffd93ac9..f863ef45b 100644 --- a/include/cpp2util.h +++ b/include/cpp2util.h @@ -1353,6 +1353,15 @@ auto as(X const& x CPP2_SOURCE_LOCATION_PARAM_WITH_DEFAULT) -> decltype(auto) { } } +template +struct is_optional : std::false_type {}; + +template +struct is_optional> : std::true_type {}; + +template +constexpr auto is_optional_v{is_optional::value}; + template< typename C, typename X > auto as( X& x ) -> decltype(auto) { if constexpr (std::is_same_v) { @@ -1364,6 +1373,9 @@ auto as( X& x ) -> decltype(auto) { else if constexpr (std::is_base_of_v) { return Dynamic_cast(x); } + else if constexpr (is_optional_v) { + return x.value(); + } else { return as(std::as_const(x)); }