From d77d6fac48b149454f5bcf8411e69bc2e56d7306 Mon Sep 17 00:00:00 2001 From: skypjack Date: Tue, 27 Jan 2026 19:04:17 +0100 Subject: [PATCH] compressed_pair: more concepts, less sfinae --- src/entt/core/compressed_pair.hpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/entt/core/compressed_pair.hpp b/src/entt/core/compressed_pair.hpp index b32b4341c..b3527df4e 100644 --- a/src/entt/core/compressed_pair.hpp +++ b/src/entt/core/compressed_pair.hpp @@ -1,6 +1,7 @@ #ifndef ENTT_CORE_COMPRESSED_PAIR_HPP #define ENTT_CORE_COMPRESSED_PAIR_HPP +#include #include #include #include @@ -18,12 +19,13 @@ struct compressed_pair_element { using reference = Type &; using const_reference = const Type &; - template>> // NOLINTNEXTLINE(modernize-use-equals-default) - constexpr compressed_pair_element() noexcept(std::is_nothrow_default_constructible_v) {} + constexpr compressed_pair_element() noexcept(std::is_nothrow_default_constructible_v) + requires std::default_initializable {} - template, compressed_pair_element>>> + template constexpr compressed_pair_element(Arg &&arg) noexcept(std::is_nothrow_constructible_v) + requires not std::same_as, compressed_pair_element> : value{std::forward(arg)} {} template @@ -49,12 +51,13 @@ struct compressed_pair_element: Type { using const_reference = const Type &; using base_type = Type; - template>> constexpr compressed_pair_element() noexcept(std::is_nothrow_default_constructible_v) + requires std::default_initializable : base_type{} {} - template, compressed_pair_element>>> + template constexpr compressed_pair_element(Arg &&arg) noexcept(std::is_nothrow_constructible_v) + requires not std::same_as, compressed_pair_element> : base_type{std::forward(arg)} {} template @@ -100,11 +103,9 @@ public: * * This constructor is only available when the types that the pair stores * are both at least default constructible. - * - * @tparam Dummy Dummy template parameter used for internal purposes. */ - template && std::is_default_constructible_v>> constexpr compressed_pair() noexcept(std::is_nothrow_default_constructible_v && std::is_nothrow_default_constructible_v) + requires std::default_initializable && std::default_initializable : first_base{}, second_base{} {}