mirror of
https://github.com/pybind/pybind11.git
synced 2025-02-16 21:57:55 +00:00
Allows users to specialize polymorphic_type_hook with std::enable_if.
Currently user specializations of the form template <typename itype> struct polymorphic_type_hook<itype, std::enable_if_t<...>> { ... }; will fail if itype is also polymorphic, because the existing specialization will also be enabled, which leads to 2 equally viable candidates. With this change, user provided specializations have higher priority than the built in specialization for polymorphic types.
This commit is contained in:
parent
0234871649
commit
4697149d19
@ -835,19 +835,25 @@ NAMESPACE_END(detail)
|
|||||||
// You may specialize polymorphic_type_hook yourself for types that want to appear
|
// You may specialize polymorphic_type_hook yourself for types that want to appear
|
||||||
// polymorphic to Python but do not use C++ RTTI. (This is a not uncommon pattern
|
// polymorphic to Python but do not use C++ RTTI. (This is a not uncommon pattern
|
||||||
// in performance-sensitive applications, used most notably in LLVM.)
|
// in performance-sensitive applications, used most notably in LLVM.)
|
||||||
|
//
|
||||||
|
// polymorphic_type_hook_base allows users to specialize polymorphic_type_hook with
|
||||||
|
// std::enable_if. User provided specializations will always have higher priority than
|
||||||
|
// the default implementation and specialization provided in polymorphic_type_hook_base.
|
||||||
template <typename itype, typename SFINAE = void>
|
template <typename itype, typename SFINAE = void>
|
||||||
struct polymorphic_type_hook
|
struct polymorphic_type_hook_base
|
||||||
{
|
{
|
||||||
static const void *get(const itype *src, const std::type_info*&) { return src; }
|
static const void *get(const itype *src, const std::type_info*&) { return src; }
|
||||||
};
|
};
|
||||||
template <typename itype>
|
template <typename itype>
|
||||||
struct polymorphic_type_hook<itype, detail::enable_if_t<std::is_polymorphic<itype>::value>>
|
struct polymorphic_type_hook_base<itype, detail::enable_if_t<std::is_polymorphic<itype>::value>>
|
||||||
{
|
{
|
||||||
static const void *get(const itype *src, const std::type_info*& type) {
|
static const void *get(const itype *src, const std::type_info*& type) {
|
||||||
type = src ? &typeid(*src) : nullptr;
|
type = src ? &typeid(*src) : nullptr;
|
||||||
return dynamic_cast<const void*>(src);
|
return dynamic_cast<const void*>(src);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
template <typename itype, typename SFINAE = void>
|
||||||
|
struct polymorphic_type_hook : public polymorphic_type_hook_base<itype> {};
|
||||||
|
|
||||||
NAMESPACE_BEGIN(detail)
|
NAMESPACE_BEGIN(detail)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user