support std::shared_ptr<const X> and types that indirectly derive from std::enable_shared_from_this

This commit is contained in:
Wenzel Jakob 2016-03-08 17:59:10 +01:00
parent fdc00f5077
commit 309a85ba59
2 changed files with 3 additions and 3 deletions

View File

@ -204,7 +204,7 @@ public:
protected: protected:
template <typename T = type, typename std::enable_if<detail::is_copy_constructible<T>::value, int>::type = 0> template <typename T = type, typename std::enable_if<detail::is_copy_constructible<T>::value, int>::type = 0>
static void *copy_constructor(const void *arg) { static void *copy_constructor(const void *arg) {
return new type(*((const type *) arg)); return (void *) new type(*((const type *) arg));
} }
template <typename T = type, typename std::enable_if<!detail::is_copy_constructible<T>::value, int>::type = 0> template <typename T = type, typename std::enable_if<!detail::is_copy_constructible<T>::value, int>::type = 0>
static void *copy_constructor(const void *) { return nullptr; } static void *copy_constructor(const void *) { return nullptr; }
@ -508,7 +508,7 @@ public:
return true; return true;
} else if (PyType_IsSubtype(Py_TYPE(src.ptr()), typeinfo->type)) { } else if (PyType_IsSubtype(Py_TYPE(src.ptr()), typeinfo->type)) {
auto inst = (instance<type, holder_type> *) src.ptr(); auto inst = (instance<type, holder_type> *) src.ptr();
value = inst->value; value = (void *) inst->value;
holder = inst->holder; holder = inst->holder;
return true; return true;
} }

View File

@ -864,7 +864,7 @@ private:
template <typename T> template <typename T>
static void init_holder_helper(instance_type *inst, const holder_type * /* unused */, const std::enable_shared_from_this<T> * /* dummy */) { static void init_holder_helper(instance_type *inst, const holder_type * /* unused */, const std::enable_shared_from_this<T> * /* dummy */) {
try { try {
new (&inst->holder) holder_type(inst->value->shared_from_this()); new (&inst->holder) holder_type(std::static_pointer_cast<type>(inst->value->shared_from_this()));
} catch (const std::bad_weak_ptr &) { } catch (const std::bad_weak_ptr &) {
new (&inst->holder) holder_type(inst->value); new (&inst->holder) holder_type(inst->value);
} }