Переглянути джерело

Merge pull request #359 from crazybie/main

[binding]fix: cannot overload  static functions.
BLUELOVETH 10 місяців тому
батько
коміт
13884aaadf

+ 3 - 6
include/pybind11/internal/function.h

@@ -591,10 +591,8 @@ class property : public object {
         object(type::of<property>()(getter, setter)) {}
 };
 
-class staticmethod : public object {
-    PKBIND_TYPE_IMPL(object, staticmethod, tp_staticmethod);
-
-    staticmethod(handle method) : object(type::of<staticmethod>()(method)) {}
+class staticmethod : public cpp_function {
+    PKBIND_TYPE_IMPL(cpp_function, staticmethod, tp_staticmethod);
 };
 
 namespace impl {
@@ -619,8 +617,7 @@ void bind_function(handle obj, const char* name_, Fn&& fn, const Extras&... extr
             py_setdict(
                 obj.ptr(),
                 name,
-                staticmethod(cpp_function(is_method, name_, std::forward<Fn>(fn), extras...).ptr())
-                    .ptr());
+                staticmethod(is_method, name_, std::forward<Fn>(fn), extras...).ptr());
         } else {
             if constexpr(has_named_args && is_method) {
                 py_setdict(

+ 12 - 1
include/pybind11/tests/function.cpp

@@ -195,6 +195,18 @@ TEST_F(PYBIND11_TEST, overload) {
 
     EXPECT_EVAL_EQ("cal(1, 2)", 3);
     EXPECT_EVAL_EQ("cal(1, 2, 3)", 6);
+
+    struct Point {
+        static int sum(int x) { return x; }
+
+        static int sum(int x, int y) { return x + y; }
+    };
+
+    py::class_<Point>(m, "Point")
+        .def_static("sum", py::overload_cast<int>(&Point::sum))
+        .def_static("sum", py::overload_cast<int, int>(&Point::sum));
+    EXPECT_EVAL_EQ("Point.sum(1)", 1);
+    EXPECT_EVAL_EQ("Point.sum(1, 2)", 3);
 }
 
 TEST_F(PYBIND11_TEST, return_value_policy) {
@@ -399,4 +411,3 @@ TEST_F(PYBIND11_TEST, overload_cast) {
 }
 
 }  // namespace
-