@@ -37,6 +37,11 @@ namespace boost::openmethod {
3737template <class Registry , class Class >
3838constexpr bool is_polymorphic = Registry::rtti::template is_polymorphic<Class>;
3939
40+ template <
41+ class Class , class Registry = BOOST_OPENMETHOD_DEFAULT_REGISTRY,
42+ typename = void >
43+ class virtual_ptr ;
44+
4045// =============================================================================
4146// Helpers
4247
@@ -191,6 +196,17 @@ struct parameter_traits {
191196 }
192197};
193198
199+ template <typename T, class Registry >
200+ struct parameter_traits <virtual_<T>, Registry> : virtual_traits<T, Registry> {};
201+
202+ template <class Class , class Registry >
203+ struct parameter_traits <virtual_ptr<Class, Registry, void >, Registry>
204+ : virtual_traits<virtual_ptr<Class, Registry, void >, Registry> {};
205+
206+ template <class Class , class Registry >
207+ struct parameter_traits <const virtual_ptr<Class, Registry, void >&, Registry>
208+ : virtual_traits<const virtual_ptr<Class, Registry, void >&, Registry> {};
209+
194210} // namespace detail
195211
196212// =============================================================================
@@ -264,17 +280,30 @@ struct use_classes {
264280 tuple_type tuple;
265281};
266282
283+ namespace detail {
284+
285+ template <typename , class , typename = void >
286+ struct is_virtual_smart_ptr_aux : std::false_type {};
287+
288+ template <typename Class, class Registry >
289+ struct is_virtual_smart_ptr_aux <
290+ Class, Registry,
291+ std::void_t <
292+ typename virtual_traits<Class, Registry>::template rebind<Class>>>
293+ : std::true_type {};
294+
295+ } // namespace detail
296+
297+ template <typename T, class Registry >
298+ constexpr bool is_virtual_smart_ptr =
299+ detail::is_virtual_smart_ptr_aux<T, Registry>::value;
300+
267301// =============================================================================
268302// virtual_ptr
269303
270304template <class Registry , typename Argype>
271305inline auto final_virtual_ptr (Argype&& obj);
272306
273- template <
274- class Class , class Registry = BOOST_OPENMETHOD_DEFAULT_REGISTRY,
275- typename = void >
276- class virtual_ptr ;
277-
278307namespace detail {
279308
280309template <class Class , class Registry >
@@ -516,10 +545,12 @@ constexpr bool same_smart_ptr =
516545 same_smart_ptr_aux<Class, Other, Registry>::value;
517546
518547template <class Class , class Registry >
548+ BOOST_OPENMETHOD_DETAIL_CXX20 (requires (is_virtual_smart_ptr<Class, Registry>))
519549class virtual_ptr <
520550 Class, Registry,
521- std::void_t <
522- typename virtual_traits<Class, Registry>::template rebind<Class>>> {
551+ BOOST_OPENMETHOD_DETAIL_CXX17 (
552+ std::void_t <typename virtual_traits<Class, Registry>::template rebind<
553+ Class>>) BOOST_OPENMETHOD_DETAIL_CXX20(void )> {
523554
524555 template <class , class , typename >
525556 friend class virtual_ptr ;
@@ -1245,19 +1276,6 @@ auto method<Name, ReturnType(Parameters...), Registry>::check_static_offset(
12451276// -----------------------------------------------------------------------------
12461277// method dispatch
12471278
1248- namespace detail {
1249- template <typename T, class Registry >
1250- struct parameter_traits <virtual_<T>, Registry> : virtual_traits<T, Registry> {};
1251-
1252- template <class Class , class Registry >
1253- struct parameter_traits <virtual_ptr<Class, Registry, void >, Registry>
1254- : virtual_traits<virtual_ptr<Class, Registry, void >, Registry> {};
1255-
1256- template <class Class , class Registry >
1257- struct parameter_traits <const virtual_ptr<Class, Registry, void >&, Registry>
1258- : virtual_traits<const virtual_ptr<Class, Registry, void >&, Registry> {};
1259- } // namespace detail
1260-
12611279template <
12621280 typename Name, typename ... Parameters, typename ReturnType, class Registry >
12631281BOOST_FORCEINLINE auto
0 commit comments