entt: std::remove_const_t<std::remove_reference_t<...>> -> std::remove_cvref_t<...>

This commit is contained in:
skypjack
2025-12-17 11:22:58 +01:00
parent 3390e3c563
commit 2f2fe11343
13 changed files with 52 additions and 52 deletions

View File

@@ -68,7 +68,7 @@ class basic_any: private internal::basic_any_storage<Len, Align> {
template<typename Type>
static const void *basic_vtable(const request req, const basic_any &value, const void *other) {
static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Invalid type");
static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Invalid type");
switch(const auto *elem = static_cast<const Type *>(value.data()); req) {
using enum internal::any_request;
@@ -112,7 +112,7 @@ class basic_any: private internal::basic_any_storage<Len, Align> {
template<typename Type>
static void basic_deleter(const basic_any &value) {
static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Invalid type");
static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Invalid type");
ENTT_ASSERT((value.mode == any_policy::dynamic) || ((value.mode == any_policy::embedded) && !std::is_trivially_destructible_v<Type>), "Unexpected policy");
const auto *elem = static_cast<const Type *>(value.data());
@@ -128,7 +128,7 @@ class basic_any: private internal::basic_any_storage<Len, Align> {
template<typename Type, typename... Args>
void initialize([[maybe_unused]] Args &&...args) {
using plain_type = std::remove_const_t<std::remove_reference_t<Type>>;
using plain_type = std::remove_cvref_t<Type>;
vtable = basic_vtable<plain_type>;
underlying_type = type_hash<plain_type>::value();
@@ -559,7 +559,7 @@ template<typename Type, std::size_t Len, std::size_t Align>
template<typename Type, std::size_t Len, std::size_t Align>
// NOLINTNEXTLINE(cppcoreguidelines-rvalue-reference-param-not-moved)
[[nodiscard]] std::remove_const_t<Type> any_cast(basic_any<Len, Align> &&data) noexcept {
if constexpr(std::is_copy_constructible_v<std::remove_const_t<std::remove_reference_t<Type>>>) {
if constexpr(std::is_copy_constructible_v<std::remove_cvref_t<Type>>) {
if(auto *const instance = any_cast<std::remove_reference_t<Type>>(&data); instance) {
return static_cast<Type>(std::move(*instance));
}

View File

@@ -22,7 +22,7 @@ struct compressed_pair_element {
// NOLINTNEXTLINE(modernize-use-equals-default)
constexpr compressed_pair_element() noexcept(std::is_nothrow_default_constructible_v<Type>) {}
template<typename Arg, typename = std::enable_if_t<!std::is_same_v<std::remove_const_t<std::remove_reference_t<Arg>>, compressed_pair_element>>>
template<typename Arg, typename = std::enable_if_t<!std::is_same_v<std::remove_cvref_t<Arg>, compressed_pair_element>>>
constexpr compressed_pair_element(Arg &&arg) noexcept(std::is_nothrow_constructible_v<Type, Arg>)
: value{std::forward<Arg>(arg)} {}
@@ -52,7 +52,7 @@ struct compressed_pair_element<Type, Tag, std::enable_if_t<is_ebco_eligible_v<Ty
constexpr compressed_pair_element() noexcept(std::is_nothrow_default_constructible_v<base_type>)
: base_type{} {}
template<typename Arg, typename = std::enable_if_t<!std::is_same_v<std::remove_const_t<std::remove_reference_t<Arg>>, compressed_pair_element>>>
template<typename Arg, typename = std::enable_if_t<!std::is_same_v<std::remove_cvref_t<Arg>, compressed_pair_element>>>
constexpr compressed_pair_element(Arg &&arg) noexcept(std::is_nothrow_constructible_v<base_type, Arg>)
: base_type{std::forward<Arg>(arg)} {}

View File

@@ -146,9 +146,9 @@ struct type_info final {
template<typename Type>
// NOLINTBEGIN(modernize-use-transparent-functors)
constexpr type_info(std::in_place_type_t<Type>) noexcept
: seq{type_index<std::remove_const_t<std::remove_reference_t<Type>>>::value()},
identifier{type_hash<std::remove_const_t<std::remove_reference_t<Type>>>::value()},
alias{type_name<std::remove_const_t<std::remove_reference_t<Type>>>::value()} {}
: seq{type_index<std::remove_cvref_t<Type>>::value()},
identifier{type_hash<std::remove_cvref_t<Type>>::value()},
alias{type_name<std::remove_cvref_t<Type>>::value()} {}
// NOLINTEND(modernize-use-transparent-functors)
/**
@@ -257,11 +257,11 @@ private:
*/
template<typename Type>
[[nodiscard]] const type_info &type_id() noexcept {
if constexpr(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>) {
if constexpr(std::is_same_v<Type, std::remove_cvref_t<Type>>) {
static const type_info instance{std::in_place_type<Type>};
return instance;
} else {
return type_id<std::remove_const_t<std::remove_reference_t<Type>>>();
return type_id<std::remove_cvref_t<Type>>();
}
}
@@ -269,7 +269,7 @@ template<typename Type>
template<typename Type>
// NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
[[nodiscard]] const type_info &type_id(Type &&) noexcept {
return type_id<std::remove_const_t<std::remove_reference_t<Type>>>();
return type_id<std::remove_cvref_t<Type>>();
}
} // namespace entt

View File

@@ -180,7 +180,7 @@ public:
template<typename Type>
Type &insert_or_assign(const id_type id, Type &&value) {
return any_cast<std::remove_const_t<std::remove_reference_t<Type>> &>(ctx.insert_or_assign(id, std::forward<Type>(value)).first->second);
return any_cast<std::remove_cvref_t<Type> &>(ctx.insert_or_assign(id, std::forward<Type>(value)).first->second);
}
template<typename Type>

View File

@@ -24,7 +24,7 @@ static constexpr bool tombstone_check_v = ((sizeof...(Type) == 1u) && ... && (Ty
template<typename Type>
const Type *view_placeholder() {
static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Unexpected type");
static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Unexpected type");
static const Type placeholder{};
return &placeholder;
}
@@ -227,7 +227,7 @@ class basic_view;
*/
template<typename Type, bool Checked, std::size_t Get, std::size_t Exclude>
class basic_common_view {
static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Unexpected type");
static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Unexpected type");
template<typename Return, typename View, typename Other, std::size_t... GLhs, std::size_t... ELhs, std::size_t... GRhs, std::size_t... ERhs>
friend Return internal::view_pack(const View &, const Other &, std::index_sequence<GLhs...>, std::index_sequence<ELhs...>, std::index_sequence<GRhs...>, std::index_sequence<ERhs...>);
@@ -690,7 +690,7 @@ public:
*/
template<typename Type, deletion_policy Policy>
class basic_storage_view {
static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Unexpected type");
static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Unexpected type");
protected:
/*! @cond TURN_OFF_DOXYGEN */

View File

@@ -63,7 +63,7 @@ inline constexpr bool reserve_aware_container_v = reserve_aware_container<Type>:
*/
template<typename Type>
struct basic_meta_sequence_container_traits {
static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Unexpected type");
static_assert(std::is_same_v<Type, std::remove_cvref_t<Type>>, "Unexpected type");
/*! @brief Unsigned integer type. */
using size_type = meta_sequence_container::size_type;
@@ -187,7 +187,7 @@ struct basic_meta_sequence_container_traits {
*/
template<typename Type>
struct basic_meta_associative_container_traits {
static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Unexpected type");
static_assert(std::is_same_v<Type, std::remove_cvref_t<Type>>, "Unexpected type");
/*! @brief Unsigned integer type. */
using size_type = meta_associative_container::size_type;

View File

@@ -223,7 +223,7 @@ public:
*/
template<auto Candidate>
auto conv() noexcept {
using conv_type = std::remove_const_t<std::remove_reference_t<std::invoke_result_t<decltype(Candidate), Type &>>>;
using conv_type = std::remove_cvref_t<std::invoke_result_t<decltype(Candidate), Type &>>;
auto *const op = +[](const meta_ctx &area, const void *instance) { return forward_as_meta(area, std::invoke(Candidate, *static_cast<const Type *>(instance))); };
base_type::insert_or_assign(internal::meta_conv_node{type_id<conv_type>().hash(), op});
return *this;
@@ -240,7 +240,7 @@ public:
*/
template<typename To>
meta_factory conv() noexcept {
using conv_type = std::remove_const_t<std::remove_reference_t<To>>;
using conv_type = std::remove_cvref_t<To>;
auto *const op = +[](const meta_ctx &area, const void *instance) { return forward_as_meta(area, static_cast<To>(*static_cast<const Type *>(instance))); };
base_type::insert_or_assign(internal::meta_conv_node{type_id<conv_type>().hash(), op});
return *this;
@@ -263,7 +263,7 @@ public:
meta_factory ctor() noexcept {
using descriptor = meta_function_helper_t<Type, decltype(Candidate)>;
static_assert(Policy::template value<typename descriptor::return_type>, "Invalid return type for the given policy");
static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<typename descriptor::return_type>>, Type>, "The function doesn't return an object of the required type");
static_assert(std::is_same_v<std::remove_cvref_t<typename descriptor::return_type>, Type>, "The function doesn't return an object of the required type");
base_type::insert_or_assign(internal::meta_ctor_node{type_id<typename descriptor::args_type>().hash(), descriptor::args_type::size, &meta_arg<typename descriptor::args_type>, &meta_construct<Type, Candidate, Policy>});
return *this;
}
@@ -328,8 +328,8 @@ public:
/* this is never static */
std::is_const_v<std::remove_reference_t<data_type>> ? internal::meta_traits::is_const : internal::meta_traits::is_none,
1u,
&internal::resolve<std::remove_const_t<std::remove_reference_t<data_type>>>,
&meta_arg<type_list<std::remove_const_t<std::remove_reference_t<data_type>>>>,
&internal::resolve<std::remove_cvref_t<data_type>>,
&meta_arg<type_list<std::remove_cvref_t<data_type>>>,
&meta_setter<Type, Data>,
&meta_getter<Type, Data, Policy>});
} else {
@@ -347,8 +347,8 @@ public:
name,
((!std::is_pointer_v<decltype(Data)> || std::is_const_v<data_type>) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static,
1u,
&internal::resolve<std::remove_const_t<std::remove_reference_t<data_type>>>,
&meta_arg<type_list<std::remove_const_t<std::remove_reference_t<data_type>>>>,
&internal::resolve<std::remove_cvref_t<data_type>>,
&meta_arg<type_list<std::remove_cvref_t<data_type>>>,
&meta_setter<Type, Data>,
&meta_getter<Type, Data, Policy>});
}
@@ -404,7 +404,7 @@ public:
/* this is never static */
internal::meta_traits::is_const,
0u,
&internal::resolve<std::remove_const_t<std::remove_reference_t<typename descriptor::return_type>>>,
&internal::resolve<std::remove_cvref_t<typename descriptor::return_type>>,
&meta_arg<type_list<>>,
&meta_setter<Type, Setter>,
&meta_getter<Type, Getter, Policy>});
@@ -418,7 +418,7 @@ public:
/* this is never static nor const */
internal::meta_traits::is_none,
1u,
&internal::resolve<std::remove_const_t<std::remove_reference_t<typename descriptor::return_type>>>,
&internal::resolve<std::remove_cvref_t<typename descriptor::return_type>>,
&meta_arg<type_list<type_list_element_t<static_cast<std::size_t>(args_type::size != 1u), args_type>>>,
&meta_setter<Type, Setter>,
&meta_getter<Type, Getter, Policy>});
@@ -464,7 +464,7 @@ public:
name,
(descriptor::is_const ? internal::meta_traits::is_const : internal::meta_traits::is_none) | (descriptor::is_static ? internal::meta_traits::is_static : internal::meta_traits::is_none),
descriptor::args_type::size,
&internal::resolve<std::conditional_t<std::is_same_v<Policy, as_void_t>, void, std::remove_const_t<std::remove_reference_t<typename descriptor::return_type>>>>,
&internal::resolve<std::conditional_t<std::is_same_v<Policy, as_void_t>, void, std::remove_cvref_t<typename descriptor::return_type>>>,
&meta_arg<typename descriptor::args_type>,
&meta_invoke<Type, Candidate, Policy>});

View File

@@ -51,7 +51,7 @@ public:
: ctx{&area},
data{&instance},
value_type_node{&internal::resolve<typename Type::value_type>},
const_reference_node{&internal::resolve<std::remove_const_t<std::remove_reference_t<typename Type::const_reference>>>},
const_reference_node{&internal::resolve<std::remove_cvref_t<typename Type::const_reference>>},
size_fn{meta_sequence_container_traits<std::remove_const_t<Type>>::size},
clear_fn{meta_sequence_container_traits<std::remove_const_t<Type>>::clear},
reserve_fn{meta_sequence_container_traits<std::remove_const_t<Type>>::reserve},
@@ -161,7 +161,7 @@ class meta_any {
template<typename Type>
static void basic_vtable(const internal::meta_traits req, const meta_any &value, [[maybe_unused]] const void *other) {
static_assert(std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, Type>, "Invalid type");
static_assert(std::is_same_v<std::remove_cvref_t<Type>, Type>, "Invalid type");
if(req == internal::meta_traits::is_none) {
value.node = &internal::resolve<Type>(internal::meta_context::from(*value.ctx));
@@ -248,7 +248,7 @@ public:
explicit meta_any(const meta_ctx &area, std::in_place_type_t<Type>, Args &&...args)
: storage{std::in_place_type<Type>, std::forward<Args>(args)...},
ctx{&area},
vtable{&basic_vtable<std::remove_const_t<std::remove_reference_t<Type>>>} {}
vtable{&basic_vtable<std::remove_cvref_t<Type>>} {}
/**
* @brief Constructs a wrapper taking ownership of the passed object.
@@ -470,22 +470,22 @@ public:
template<typename Type>
[[nodiscard]] meta_any allow_cast() const {
if constexpr(!std::is_reference_v<Type> || std::is_const_v<std::remove_reference_t<Type>>) {
if(storage.has_value<std::remove_const_t<std::remove_reference_t<Type>>>()) {
if(storage.has_value<std::remove_cvref_t<Type>>()) {
return as_ref();
} else if(*this) {
if constexpr(std::is_arithmetic_v<std::remove_const_t<std::remove_reference_t<Type>>> || std::is_enum_v<std::remove_const_t<std::remove_reference_t<Type>>>) {
if constexpr(std::is_arithmetic_v<std::remove_cvref_t<Type>> || std::is_enum_v<std::remove_cvref_t<Type>>) {
if(const auto &from = fetch_node(); from.conversion_helper) {
return meta_any{*ctx, static_cast<Type>(from.conversion_helper(nullptr, storage.data()))};
}
}
if(const auto &from = fetch_node(); from.details != nullptr) {
if(const auto *elem = internal::find_member<&internal::meta_conv_node::type>(from.details->conv, entt::type_hash<std::remove_const_t<std::remove_reference_t<Type>>>::value()); elem != nullptr) {
if(const auto *elem = internal::find_member<&internal::meta_conv_node::type>(from.details->conv, entt::type_hash<std::remove_cvref_t<Type>>::value()); elem != nullptr) {
return elem->conv(*ctx, storage.data());
}
for(auto &&curr: from.details->base) {
if(auto other = curr.resolve(internal::meta_context::from(*ctx)).from_void(*ctx, nullptr, curr.cast(storage.data())); curr.type == entt::type_hash<std::remove_const_t<std::remove_reference_t<Type>>>::value()) {
if(auto other = curr.resolve(internal::meta_context::from(*ctx)).from_void(*ctx, nullptr, curr.cast(storage.data())); curr.type == entt::type_hash<std::remove_cvref_t<Type>>::value()) {
return other;
} else if(auto from_base = std::as_const(other).template allow_cast<Type>(); from_base) {
return from_base;
@@ -508,9 +508,9 @@ public:
if constexpr(std::is_reference_v<Type> && !std::is_const_v<std::remove_reference_t<Type>>) {
return allow_cast<const std::remove_reference_t<Type> &>() && (storage.policy() != any_policy::cref);
} else {
if(storage.has_value<std::remove_const_t<std::remove_reference_t<Type>>>()) {
if(storage.has_value<std::remove_cvref_t<Type>>()) {
return true;
} else if(auto other = std::as_const(*this).allow_cast<std::remove_const_t<std::remove_reference_t<Type>>>(); other) {
} else if(auto other = std::as_const(*this).allow_cast<std::remove_cvref_t<Type>>(); other) {
if(other.storage.owner()) {
std::swap(*this, other);
}
@@ -526,7 +526,7 @@ public:
template<typename Type, typename... Args>
void emplace(Args &&...args) {
storage.emplace<Type>(std::forward<Args>(args)...);
auto *prev = std::exchange(vtable, &basic_vtable<std::remove_const_t<std::remove_reference_t<Type>>>);
auto *prev = std::exchange(vtable, &basic_vtable<std::remove_cvref_t<Type>>);
node = (prev == vtable) ? node : nullptr;
}

View File

@@ -192,7 +192,7 @@ const meta_type_node &resolve(const meta_context &) noexcept;
template<typename... Args>
[[nodiscard]] const meta_type_node &meta_arg_node(const meta_context &context, type_list<Args...>, const std::size_t index) noexcept {
using resolve_type = const meta_type_node &(*)(const meta_context &) noexcept;
constexpr std::array<resolve_type, sizeof...(Args)> list{&resolve<std::remove_const_t<std::remove_reference_t<Args>>>...};
constexpr std::array<resolve_type, sizeof...(Args)> list{&resolve<std::remove_cvref_t<Args>>...};
ENTT_ASSERT(index < sizeof...(Args), "Out of bounds");
return list[index](context);
}
@@ -278,7 +278,7 @@ auto setup_node_for() noexcept {
template<typename Type>
[[nodiscard]] const meta_type_node &resolve(const meta_context &context) noexcept {
static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Invalid type");
static_assert(std::is_same_v<Type, std::remove_cvref_t<Type>>, "Invalid type");
static const meta_type_node node = setup_node_for<Type>();
const auto *elem = try_resolve(context, *node.info);
return (elem == nullptr) ? node : *elem;

View File

@@ -20,7 +20,7 @@ namespace entt {
template<typename Type>
[[nodiscard]] meta_type resolve(const meta_ctx &ctx) noexcept {
const auto &context = internal::meta_context::from(ctx);
return {ctx, internal::resolve<std::remove_const_t<std::remove_reference_t<Type>>>(context)};
return {ctx, internal::resolve<std::remove_cvref_t<Type>>(context)};
}
/**

View File

@@ -93,11 +93,11 @@ struct meta_function_descriptor<Type, Ret (*)(MaybeType, Args...)>
: meta_function_descriptor_traits<
Ret,
std::conditional_t<
std::is_same_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type> || std::is_base_of_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type>,
std::is_same_v<std::remove_cvref_t<MaybeType>, Type> || std::is_base_of_v<std::remove_cvref_t<MaybeType>, Type>,
type_list<Args...>,
type_list<MaybeType, Args...>>,
!(std::is_same_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type> || std::is_base_of_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type>),
std::is_const_v<std::remove_reference_t<MaybeType>> && (std::is_same_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type> || std::is_base_of_v<std::remove_const_t<std::remove_reference_t<MaybeType>>, Type>)> {};
!(std::is_same_v<std::remove_cvref_t<MaybeType>, Type> || std::is_base_of_v<std::remove_cvref_t<MaybeType>, Type>),
std::is_const_v<std::remove_reference_t<MaybeType>> && (std::is_same_v<std::remove_cvref_t<MaybeType>, Type> || std::is_base_of_v<std::remove_cvref_t<MaybeType>, Type>)> {};
/**
* @brief Meta function descriptor.
@@ -316,7 +316,7 @@ template<typename Type, auto Data>
template<typename Type, auto Data, typename Policy = as_value_t>
[[nodiscard]] std::enable_if_t<is_meta_policy_v<Policy>, meta_any> meta_getter(meta_handle instance) {
if constexpr(std::is_member_pointer_v<decltype(Data)> || std::is_function_v<std::remove_reference_t<std::remove_pointer_t<decltype(Data)>>>) {
if constexpr(!std::is_array_v<std::remove_const_t<std::remove_reference_t<std::invoke_result_t<decltype(Data), Type &>>>>) {
if constexpr(!std::is_array_v<std::remove_cvref_t<std::invoke_result_t<decltype(Data), Type &>>>) {
if constexpr(std::is_invocable_v<decltype(Data), Type &>) {
if(auto *clazz = instance->try_cast<Type>(); clazz) {
return meta_dispatch<Policy>(instance->context(), std::invoke(Data, *clazz));
@@ -418,7 +418,7 @@ template<typename Type, typename... Args>
*/
template<typename Type, typename Policy = as_value_t, typename Candidate>
[[nodiscard]] meta_any meta_construct(const meta_ctx &ctx, Candidate &&candidate, meta_any *const args) {
if constexpr(meta_function_helper_t<Type, Candidate>::is_static || std::is_class_v<std::remove_const_t<std::remove_reference_t<Candidate>>>) {
if constexpr(meta_function_helper_t<Type, Candidate>::is_static || std::is_class_v<std::remove_cvref_t<Candidate>>) {
meta_any placeholder{meta_ctx_arg, ctx};
return internal::meta_invoke<Type, Policy>(placeholder, std::forward<Candidate>(candidate), args, std::make_index_sequence<meta_function_helper_t<Type, std::remove_reference_t<Candidate>>::args_type::size>{});
} else {

View File

@@ -211,16 +211,16 @@ public:
template<typename Type, typename... Args>
explicit basic_poly(std::in_place_type_t<Type>, Args &&...args)
: storage{std::in_place_type<Type>, std::forward<Args>(args)...},
vtable{poly_vtable<Concept, Len, Align>::template instance<std::remove_const_t<std::remove_reference_t<Type>>>()} {}
vtable{poly_vtable<Concept, Len, Align>::template instance<std::remove_cvref_t<Type>>()} {}
/**
* @brief Constructs a poly from a given value.
* @tparam Type Type of object to use to initialize the poly.
* @param value An instance of an object to use to initialize the poly.
*/
template<typename Type, typename = std::enable_if_t<!std::is_same_v<std::remove_const_t<std::remove_reference_t<Type>>, basic_poly>>>
template<typename Type, typename = std::enable_if_t<!std::is_same_v<std::remove_cvref_t<Type>, basic_poly>>>
basic_poly(Type &&value) noexcept
: basic_poly{std::in_place_type<std::remove_const_t<std::remove_reference_t<Type>>>, std::forward<Type>(value)} {}
: basic_poly{std::in_place_type<std::remove_cvref_t<Type>>, std::forward<Type>(value)} {}
/**
* @brief Returns the object type info if any, `type_id<void>()` otherwise.
@@ -252,7 +252,7 @@ public:
template<typename Type, typename... Args>
void emplace(Args &&...args) {
storage.template emplace<Type>(std::forward<Args>(args)...);
vtable = poly_vtable<Concept, Len, Align>::template instance<std::remove_const_t<std::remove_reference_t<Type>>>();
vtable = poly_vtable<Concept, Len, Align>::template instance<std::remove_cvref_t<Type>>();
}
/*! @brief Destroys contained object */

View File

@@ -147,7 +147,7 @@ public:
*/
template<typename Type>
void erase() {
handlers.first().erase(type_hash<std::remove_const_t<std::remove_reference_t<Type>>>::value());
handlers.first().erase(type_hash<std::remove_cvref_t<Type>>::value());
}
/*! @brief Disconnects all the listeners. */
@@ -162,7 +162,7 @@ public:
*/
template<typename Type>
[[nodiscard]] bool contains() const {
return handlers.first().contains(type_hash<std::remove_const_t<std::remove_reference_t<Type>>>::value());
return handlers.first().contains(type_hash<std::remove_cvref_t<Type>>::value());
}
/**