,
+ accessor_t...>;
template
concept pointer_like = (std::is_pointer_v ||
@@ -597,7 +590,7 @@ consteval bool is_facade_constraints_well_formed() {
template
struct basic_facade_conv_traits_impl : inapplicable_traits {};
template
- requires(basic_conv_traits::applicable && ...)
+ requires(basic_convention && ...)
struct basic_facade_conv_traits_impl : applicable_traits {};
template
struct basic_facade_refl_traits_impl : inapplicable_traits {};
@@ -623,30 +616,53 @@ struct basic_facade_traits : applicable_traits {};
template
struct facade_conv_traits_impl {
- using conv_meta =
- composite_t, typename conv_traits::meta...>;
- using conv_indirect_accessor =
- composite_t, conv_accessor_t...>;
- using conv_direct_accessor =
- composite_t, conv_accessor_t...>;
+ static_assert(
+ (overload_traits<
+ substituted_overload_t>::applicable &&
+ ...),
+ "a facade-aware overload did not substitute into a valid overload");
+ using conv_meta = std::tuple, proxy_indirect_accessor>,
+ typename Cs::dispatch_type,
+ substituted_overload_t>...>;
+ using indirect_conv_groups = conv_groups_merge_t<
+ std::tuple<>,
+ composite_t<
+ std::tuple<>,
+ std::conditional_t>...>>;
+ using direct_conv_groups = conv_groups_merge_t<
+ std::tuple<>,
+ composite_t,
+ std::conditional_t,
+ void>...>>;
template
static consteval void diagnose_proxiable_conv() {
- (conv_traits::template diagnose_proxiable(), ...);
+ (diagnose_proxiable_required_convention_not_implemented<
+ P, F, Cs::is_direct, typename Cs::dispatch_type,
+ substituted_overload_t>(),
+ ...);
}
template
static constexpr bool conv_applicable_ptr =
- (conv_traits::template applicable_ptr && ...);
+ (overload_traits>::
+ template applicable_ptr &&
+ ...);
};
template
struct facade_refl_traits_impl {
using refl_meta = std::tuple<
reflection_meta...>;
- using refl_indirect_accessor =
- composite_t, refl_accessor_t...>;
- using refl_direct_accessor =
- composite_t, refl_accessor_t...>;
+ using indirect_refls =
+ composite_t, std::conditional_t...>;
+ using direct_refls =
+ composite_t, std::conditional_t...>;
template
static consteval void diagnose_proxiable_refl() {
@@ -678,12 +694,17 @@ struct facade_traits : specialization_t,
typename facade_traits::conv_meta,
typename facade_traits::refl_meta>>;
- using indirect_accessor =
- composite_t;
- using direct_accessor =
- composite_t;
+ using indirect_accessor = composite_t<
+ specialization_t, F>,
+ specialization_t>>;
+ using direct_accessor = composite_t<
+ specialization_t, F>,
+ specialization_t>>;
template