Skip to content

Instantly share code, notes, and snippets.

@EricWF
Created August 15, 2016 02:03
Show Gist options
  • Select an option

  • Save EricWF/49ffb06a2ac904b5f4729c1e72725fbe to your computer and use it in GitHub Desktop.

Select an option

Save EricWF/49ffb06a2ac904b5f4729c1e72725fbe to your computer and use it in GitHub Desktop.
diff --git a/include/optional b/include/optional
index 3315334..2f76429 100644
--- a/include/optional
+++ b/include/optional
@@ -384,70 +384,17 @@ constexpr bool _Is_specialization = false;
template <class... _Args, template <class...> class _Template>
constexpr bool _Is_specialization<_Template<_Args...>, _Template> = true;
-template <bool _CanCopy, bool _CanMove>
-struct __optional_sfinae_ctor_base;
-template <>
-struct __optional_sfinae_ctor_base<true, true> {};
-template <>
-struct __optional_sfinae_ctor_base<false, false> {
- __optional_sfinae_ctor_base() = default;
- __optional_sfinae_ctor_base(__optional_sfinae_ctor_base const&) = delete;
- __optional_sfinae_ctor_base(__optional_sfinae_ctor_base &&) = delete;
- __optional_sfinae_ctor_base& operator=(__optional_sfinae_ctor_base const&) = delete;
- __optional_sfinae_ctor_base& operator=(__optional_sfinae_ctor_base&&) = delete;
-};
-template <>
-struct __optional_sfinae_ctor_base<true, false> {
- __optional_sfinae_ctor_base() = default;
- __optional_sfinae_ctor_base(__optional_sfinae_ctor_base const&) = default;
- __optional_sfinae_ctor_base(__optional_sfinae_ctor_base &&) = delete;
- __optional_sfinae_ctor_base& operator=(__optional_sfinae_ctor_base const&) = default;
- __optional_sfinae_ctor_base& operator=(__optional_sfinae_ctor_base&&) = delete;
-};
-template <>
-struct __optional_sfinae_ctor_base<false, true> {
- __optional_sfinae_ctor_base() = default;
- __optional_sfinae_ctor_base(__optional_sfinae_ctor_base const&) = delete;
- __optional_sfinae_ctor_base(__optional_sfinae_ctor_base &&) = default;
- __optional_sfinae_ctor_base& operator=(__optional_sfinae_ctor_base const&) = delete;
- __optional_sfinae_ctor_base& operator=(__optional_sfinae_ctor_base&&) = default;
-};
template <class _Tp>
-using __optional_sfinae_ctor_base_t = __optional_sfinae_ctor_base<
+using __optional_sfinae_ctor_base_t = __sfinae_ctor_base<
is_copy_constructible<_Tp>::value,
is_move_constructible<_Tp>::value
>;
-template <bool _CanCopy, bool _CanMove>
-struct __optional_sfinae_assign_base {};
-template <>
-struct __optional_sfinae_assign_base<false, false> {
- __optional_sfinae_assign_base() = default;
- __optional_sfinae_assign_base(__optional_sfinae_assign_base const&) = default;
- __optional_sfinae_assign_base(__optional_sfinae_assign_base &&) = default;
- __optional_sfinae_assign_base& operator=(__optional_sfinae_assign_base const&) = delete;
- __optional_sfinae_assign_base& operator=(__optional_sfinae_assign_base&&) = delete;
-};
-template <>
-struct __optional_sfinae_assign_base<true, false> {
- __optional_sfinae_assign_base() = default;
- __optional_sfinae_assign_base(__optional_sfinae_assign_base const&) = default;
- __optional_sfinae_assign_base(__optional_sfinae_assign_base &&) = default;
- __optional_sfinae_assign_base& operator=(__optional_sfinae_assign_base const&) = default;
- __optional_sfinae_assign_base& operator=(__optional_sfinae_assign_base&&) = delete;
-};
-template <>
-struct __optional_sfinae_assign_base<false, true> {
- __optional_sfinae_assign_base() = default;
- __optional_sfinae_assign_base(__optional_sfinae_assign_base const&) = default;
- __optional_sfinae_assign_base(__optional_sfinae_assign_base &&) = default;
- __optional_sfinae_assign_base& operator=(__optional_sfinae_assign_base const&) = delete;
- __optional_sfinae_assign_base& operator=(__optional_sfinae_assign_base&&) = default;
-};
template <class _Tp>
-using __optional_sfinae_assign_base_t = __optional_sfinae_assign_base<
- is_copy_assignable<_Tp>::value,
- is_move_assignable<_Tp>::value
+using __optional_sfinae_assign_base_t = __sfinae_assign_base<
+ (is_copy_constructible<_Tp>::value && is_copy_assignable<_Tp>::value),
+ (is_move_constructible<_Tp>::value && is_move_assignable<_Tp>::value) ||
+ (is_copy_constructible<_Tp>::value && is_copy_assignable<_Tp>::value)
>;
template <class _Tp>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment