longer necessary. The Implementation can now become a simple 'using' directive (#134).main
template<class EF> | template<class EF> | ||||
class scope_exit : public detail::scope_guard_base<EF, detail::scope_exit_strategy> | class scope_exit : public detail::scope_guard_base<EF, detail::scope_exit_strategy> | ||||
{ | { | ||||
using Base = detail::scope_guard_base<EF, detail::scope_exit_strategy>; | |||||
using ScopeGuardBase = std::enable_if_t<!std::is_same_v<detail::remove_cvref_t<EF>, scope_exit<EF>>, | |||||
detail::scope_guard_base<EF, detail::scope_exit_strategy> | |||||
>; | |||||
public: | public: | ||||
template<class EFP, | |||||
std::enable_if_t<std::is_constructible_v<EF, EFP>, int> = 0, | |||||
std::enable_if_t<!std::is_same_v<detail::remove_cvref_t<EFP>, scope_exit<EF>>, int> = 0 | |||||
> | |||||
explicit scope_exit(EFP&& exitFunction) noexcept(std::is_nothrow_constructible_v<EF, EFP> | |||||
|| std::is_nothrow_constructible_v<EF, EFP&>) | |||||
: Base(std::forward<EFP>(exitFunction)) | |||||
{ | |||||
} | |||||
using ScopeGuardBase::ScopeGuardBase; | |||||
}; | }; | ||||
template<class EF> | template<class EF> | ||||
class scope_fail : public detail::scope_guard_base<EF, detail::scope_fail_strategy> | class scope_fail : public detail::scope_guard_base<EF, detail::scope_fail_strategy> | ||||
{ | { | ||||
using Base = detail::scope_guard_base<EF, detail::scope_fail_strategy>; | |||||
using ScopeGuardBase = std::enable_if_t<!std::is_same_v<detail::remove_cvref_t<EF>, scope_fail<EF>>, | |||||
detail::scope_guard_base<EF, detail::scope_fail_strategy> | |||||
>; | |||||
public: | public: | ||||
template<class EFP, | |||||
std::enable_if_t<std::is_constructible_v<EF, EFP>, int> = 0, | |||||
std::enable_if_t<!std::is_same_v<detail::remove_cvref_t<EFP>, scope_fail<EF>>, int> = 0 | |||||
> | |||||
explicit scope_fail(EFP&& exitFunction) noexcept(std::is_nothrow_constructible_v<EF, EFP> | |||||
|| std::is_nothrow_constructible_v<EF, EFP&>) | |||||
: Base(std::forward<EFP>(exitFunction)) | |||||
{ | |||||
} | |||||
using ScopeGuardBase::ScopeGuardBase; | |||||
}; | }; | ||||
template<class EF> | template<class EF> | ||||
class scope_success : public detail::scope_guard_base<EF, detail::scope_success_strategy> | class scope_success : public detail::scope_guard_base<EF, detail::scope_success_strategy> | ||||
{ | { | ||||
using Base = detail::scope_guard_base<EF, detail::scope_success_strategy>; | |||||
using ScopeGuardBase = std::enable_if_t<!std::is_same_v<detail::remove_cvref_t<EF>, scope_success<EF>>, | |||||
detail::scope_guard_base<EF, detail::scope_success_strategy> | |||||
>; | |||||
public: | public: | ||||
template<class EFP, | |||||
std::enable_if_t<std::is_constructible_v<EF, EFP>, int> = 0, | |||||
std::enable_if_t<!std::is_same_v<detail::remove_cvref_t<EFP>, scope_success<EF>>, int> = 0 | |||||
> | |||||
explicit scope_success(EFP&& exitFunction) noexcept(std::is_nothrow_constructible_v<EF, EFP> | |||||
|| std::is_nothrow_constructible_v<EF, EFP&>) | |||||
: Base(std::forward<EFP>(exitFunction)) | |||||
{ | |||||
} | |||||
using ScopeGuardBase::ScopeGuardBase; | |||||
}; | }; | ||||