@@ -816,30 +816,6 @@ template <typename Container> struct is_copy_assignable<Container, enable_if_t<a
816
816
template <typename T1, typename T2> struct is_copy_assignable <std::pair<T1, T2>>
817
817
: all_of<is_copy_assignable<T1>, is_copy_assignable<T2>> {};
818
818
819
- // Helper for type_caster_base.
820
- struct make_constructor {
821
- using Constructor = void *(*)(const void *);
822
-
823
- /* Only enabled when the types are {copy,move}-constructible *and* when the type
824
- does not have a private operator new implementation. */
825
- template <typename T, typename = enable_if_t <is_copy_constructible<T>::value>>
826
- static auto make_copy_constructor (const T *x) -> decltype(new T(*x), Constructor{}) {
827
- return [](const void *arg) -> void * {
828
- return new T (*reinterpret_cast <const T *>(arg));
829
- };
830
- }
831
-
832
- template <typename T, typename = enable_if_t <std::is_move_constructible<T>::value>>
833
- static auto make_move_constructor (const T *x) -> decltype(new T(std::move(*const_cast <T *>(x))), Constructor{}) {
834
- return [](const void *arg) -> void * {
835
- return new T (std::move (*const_cast <T *>(reinterpret_cast <const T *>(arg))));
836
- };
837
- }
838
-
839
- static Constructor make_copy_constructor (...) { return nullptr ; }
840
- static Constructor make_move_constructor (...) { return nullptr ; }
841
- };
842
-
843
819
PYBIND11_NAMESPACE_END (detail)
844
820
845
821
// polymorphic_type_hook<itype>::get(src, tinfo) determines whether the object pointed
@@ -882,8 +858,7 @@ struct polymorphic_type_hook : public polymorphic_type_hook_base<itype> {};
882
858
PYBIND11_NAMESPACE_BEGIN (detail)
883
859
884
860
// / Generic type caster for objects stored on the heap
885
- template <typename type> class type_caster_base : public type_caster_generic,
886
- protected make_constructor {
861
+ template <typename type> class type_caster_base : public type_caster_generic {
887
862
using itype = intrinsic_t <type>;
888
863
889
864
public:
@@ -944,6 +919,28 @@ template <typename type> class type_caster_base : public type_caster_generic,
944
919
945
920
operator itype*() { return (type *) value; }
946
921
operator itype&() { if (!value) throw reference_cast_error (); return *((itype *) value); }
922
+
923
+ protected:
924
+ using Constructor = void *(*)(const void *);
925
+
926
+ /* Only enabled when the types are {copy,move}-constructible *and* when the type
927
+ does not have a private operator new implementation. */
928
+ template <typename T, typename = enable_if_t <is_copy_constructible<T>::value>>
929
+ static auto make_copy_constructor (const T *x) -> decltype (new T (*x), Constructor{}) {
930
+ return [](const void *arg) -> void * {
931
+ return new T (*reinterpret_cast <const T *>(arg));
932
+ };
933
+ }
934
+
935
+ template <typename T, typename = enable_if_t <std::is_move_constructible<T>::value>>
936
+ static auto make_move_constructor (const T *x) -> decltype (new T (std::move (*const_cast <T *>(x))), Constructor{}) {
937
+ return [](const void *arg) -> void * {
938
+ return new T (std::move (*const_cast <T *>(reinterpret_cast <const T *>(arg))));
939
+ };
940
+ }
941
+
942
+ static Constructor make_copy_constructor (...) { return nullptr ; }
943
+ static Constructor make_move_constructor (...) { return nullptr ; }
947
944
};
948
945
949
946
template <typename type, typename SFINAE = void > class type_caster : public type_caster_base <type> { };
0 commit comments