auto thrown(T &&thing) { return thrown_raw<Exception>(filter( [](auto &&e) { return std::string(e.what()); }, ensure_matcher(std::forward<T>(thing)), "what: " )); }
inline auto exited(T &&thing) { auto matcher = ensure_matcher(std::forward<T>(thing)); return detail::exited_impl<decltype(matcher)>(std::move(matcher)); }
auto thrown_raw(T &&thing) { auto matcher = ensure_matcher(std::forward<T>(thing)); return detail::thrown_impl<Exception, decltype(matcher)>(std::move(matcher)); }
auto each(T &&thing) { return detail::member_impl<ensure_matcher_t<T>>( "each ", true, ensure_matcher(std::forward<T>(thing)) ); }
auto member(T &&thing) { return detail::member_impl<ensure_matcher_t<T>>( "member ", false, ensure_matcher(std::forward<T>(thing)) ); }
inline auto tuple(T &&...things) { return detail::tuple_impl<ensure_matcher_t<T>...>( ensure_matcher(std::forward<T>(things))... ); }