From 7b303eee2ba422ab79c6f66a751de7962469171c Mon Sep 17 00:00:00 2001 From: lisong Date: Sat, 26 Apr 2025 11:09:05 +0800 Subject: [PATCH] fix: can't bind method with pointer argument. --- include/pybind11/internal/function.h | 2 +- include/pybind11/tests/class.cpp | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/pybind11/internal/function.h b/include/pybind11/internal/function.h index 05894fed..2c84e756 100644 --- a/include/pybind11/internal/function.h +++ b/include/pybind11/internal/function.h @@ -280,7 +280,7 @@ void invoke(Fn&& fn, if constexpr(is_member_function_pointer) { // helper function to unpack the arguments to call the member pointer - auto unpack = [&](class_type_t& self, auto&... args) { + auto unpack = [&](class_type_t& self, auto&&... args) { return (self.*fn)(args...); }; diff --git a/include/pybind11/tests/class.cpp b/include/pybind11/tests/class.cpp index b547a810..2e632d50 100644 --- a/include/pybind11/tests/class.cpp +++ b/include/pybind11/tests/class.cpp @@ -45,6 +45,12 @@ public: std::string stringfy() const { return "(" + std::to_string(x) + ", " + std::to_string(y) + ", " + std::to_string(z) + ")"; } + + void set_pointer(Point* p) { + this->x = p->x; + this->y = p->y; + this->z = p->z; + } }; struct Line { @@ -60,7 +66,8 @@ TEST_F(PYBIND11_TEST, class) { .def_readwrite("x", &Point::x) .def_readwrite("y", &Point::y) .def_property("z", &Point::get_z, &Point::set_z) - .def("stringfy", &Point::stringfy); + .def("stringfy", &Point::stringfy) + .def("set_pointer", &Point::set_pointer); py::exec(R"( p = Point() @@ -74,6 +81,8 @@ p.x = 10 p.y = 20 p.z = 30 assert p.stringfy() == '(10, 20, 30)' +p.set_pointer(Point(4,5,6)) +assert p.stringfy() == '(4, 5, 6)' )"); py::class_ line(m, "Line");