mirror of
https://github.com/RYDE-WORK/pybind11.git
synced 2026-02-05 15:03:18 +08:00
Adding pybind11::cast overload for rvalue references (#1260)
* Adding pybind11::cast overload for rvalue references
This commit is contained in:
parent
fc3a4490b8
commit
d54d6d8c61
@ -1725,13 +1725,16 @@ T cast(const handle &handle) { return T(reinterpret_borrow<object>(handle)); }
|
|||||||
|
|
||||||
// C++ type -> py::object
|
// C++ type -> py::object
|
||||||
template <typename T, detail::enable_if_t<!detail::is_pyobject<T>::value, int> = 0>
|
template <typename T, detail::enable_if_t<!detail::is_pyobject<T>::value, int> = 0>
|
||||||
object cast(const T &value, return_value_policy policy = return_value_policy::automatic_reference,
|
object cast(T &&value, return_value_policy policy = return_value_policy::automatic_reference,
|
||||||
handle parent = handle()) {
|
handle parent = handle()) {
|
||||||
|
using no_ref_T = typename std::remove_reference<T>::type;
|
||||||
if (policy == return_value_policy::automatic)
|
if (policy == return_value_policy::automatic)
|
||||||
policy = std::is_pointer<T>::value ? return_value_policy::take_ownership : return_value_policy::copy;
|
policy = std::is_pointer<no_ref_T>::value ? return_value_policy::take_ownership :
|
||||||
|
std::is_lvalue_reference<T>::value ? return_value_policy::copy : return_value_policy::move;
|
||||||
else if (policy == return_value_policy::automatic_reference)
|
else if (policy == return_value_policy::automatic_reference)
|
||||||
policy = std::is_pointer<T>::value ? return_value_policy::reference : return_value_policy::copy;
|
policy = std::is_pointer<no_ref_T>::value ? return_value_policy::reference :
|
||||||
return reinterpret_steal<object>(detail::make_caster<T>::cast(value, policy, parent));
|
std::is_lvalue_reference<T>::value ? return_value_policy::copy : return_value_policy::move;
|
||||||
|
return reinterpret_steal<object>(detail::make_caster<T>::cast(std::forward<T>(value), policy, parent));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> T handle::cast() const { return pybind11::cast<T>(*this); }
|
template <typename T> T handle::cast() const { return pybind11::cast<T>(*this); }
|
||||||
|
|||||||
@ -291,7 +291,8 @@ TEST_SUBMODULE(smart_ptr, m) {
|
|||||||
~C() { print_destroyed(this); }
|
~C() { print_destroyed(this); }
|
||||||
};
|
};
|
||||||
py::class_<C, custom_unique_ptr<C>>(m, "TypeWithMoveOnlyHolder")
|
py::class_<C, custom_unique_ptr<C>>(m, "TypeWithMoveOnlyHolder")
|
||||||
.def_static("make", []() { return custom_unique_ptr<C>(new C); });
|
.def_static("make", []() { return custom_unique_ptr<C>(new C); })
|
||||||
|
.def_static("make_as_object", []() { return py::cast(custom_unique_ptr<C>(new C)); });
|
||||||
|
|
||||||
// test_holder_with_addressof_operator
|
// test_holder_with_addressof_operator
|
||||||
struct TypeForHolderWithAddressOf {
|
struct TypeForHolderWithAddressOf {
|
||||||
|
|||||||
@ -218,7 +218,10 @@ def test_shared_ptr_from_this_and_references():
|
|||||||
|
|
||||||
def test_move_only_holder():
|
def test_move_only_holder():
|
||||||
a = m.TypeWithMoveOnlyHolder.make()
|
a = m.TypeWithMoveOnlyHolder.make()
|
||||||
|
b = m.TypeWithMoveOnlyHolder.make_as_object()
|
||||||
stats = ConstructorStats.get(m.TypeWithMoveOnlyHolder)
|
stats = ConstructorStats.get(m.TypeWithMoveOnlyHolder)
|
||||||
|
assert stats.alive() == 2
|
||||||
|
del b
|
||||||
assert stats.alive() == 1
|
assert stats.alive() == 1
|
||||||
del a
|
del a
|
||||||
assert stats.alive() == 0
|
assert stats.alive() == 0
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user