C++で戻り値をoptional<T>に限定したいとき、template <typename T> optional<T> f()とかだとテンプレートパラメータの明示が必要になってしまうので、template <typename T> auto f()として、戻り値の型decltype(f())とoptional<remove_reference_t<decltype(declval<decltype(f())>().value())>>が同型であるかチェックすれば実現できた。
optionalはクラステンプレートなので、これまたなかなか面倒だが、is_optionalを自前で作っても良さそう #fedibird