mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-11 08:03:55 +00:00
support std::shared_ptr<const X> and types that indirectly derive from std::enable_shared_from_this
This commit is contained in:
parent
fdc00f5077
commit
309a85ba59
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user