From: Yedidya Feldblum <yfeldblum@fb.com> Date: Wed, 11 Jan 2017 04:53:38 +0000 (-0800) Subject: Slight simplification of exception_wrapper constructor X-Git-Tag: v2017.03.06.00~106 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f144d22401381441e36b4a96e4287806a971d554;p=folly.git Slight simplification of exception_wrapper constructor Summary: [Folly] Slight simplification of `exception_wrapper` constructor. Reviewed By: ericniebler Differential Revision: D4391899 fbshipit-source-id: ddb066723bcd10abb0dbbaeab12b1e9be4f39acc --- diff --git a/folly/ExceptionWrapper.h b/folly/ExceptionWrapper.h index f839af7d..bd5bc119 100644 --- a/folly/ExceptionWrapper.h +++ b/folly/ExceptionWrapper.h @@ -111,19 +111,16 @@ class exception_wrapper { template <typename T> using is_exception_ = std::is_base_of<std::exception, T>; - template <typename Ex> - struct optimize; - public: exception_wrapper() = default; - // Implicitly construct an exception_wrapper from a qualifying exception. - // See the optimize struct for details. template < typename Ex, - typename = _t<std::enable_if<optimize<_t<std::decay<Ex>>>::value>>> + typename DEx = _t<std::decay<Ex>>, + typename = _t<std::enable_if<is_exception_<DEx>::value>>, + typename = decltype(DEx(std::forward<Ex>(std::declval<Ex&&>())))> /* implicit */ exception_wrapper(Ex&& exn) { - assign_sptr(std::make_shared<_t<std::decay<Ex>>>(std::forward<Ex>(exn))); + assign_sptr<DEx>(std::forward<Ex>(exn)); } // The following two constructors are meant to emulate the behavior of @@ -238,17 +235,9 @@ class exception_wrapper { } private: - template <typename Ex> - struct optimize { - static const bool value = - std::is_base_of<std::exception, Ex>::value && - std::is_copy_assignable<Ex>::value && - !std::is_abstract<Ex>::value; - }; - - template <typename Ex> - void assign_sptr(std::shared_ptr<Ex> sptr) { - this->item_ = std::move(sptr); + template <typename Ex, typename... Args> + void assign_sptr(Args&&... args) { + this->item_ = std::make_shared<Ex>(std::forward<Args>(args)...); this->throwfn_ = Thrower<Ex>::doThrow; } @@ -348,10 +337,10 @@ class exception_wrapper { } }; -template <class T, class... Args> +template <class Ex, class... Args> exception_wrapper make_exception_wrapper(Args&&... args) { exception_wrapper ew; - ew.assign_sptr(std::make_shared<T>(std::forward<Args>(args)...)); + ew.assign_sptr<Ex>(std::forward<Args>(args)...); return ew; }