无法在 pybind11 中绑定重载的静态成员函数

ale*_*.tu 2 c++ python function-pointers pointer-to-member pybind11

我尝试使用 pybind11 绑定静态重载函数,但遇到了一些问题。

\n\n

这是示例代码

\n\n
#include <pybind11/pybind11.h>\n\nnamespace py = pybind11;\n\nclass TESTDB {\n  public:\n    static void aaaa(int a, int b) {printf("aaaaa");};\n    static void aaaa(int a) {printf("xxxxx");};\n};\n\nPYBIND11_MODULE(example, m) {\n\n\n  py::class_<TESTDB>(m, "db")\n     .def_static("aaaa", (void (TESTDB::*)(int, int)) &TESTDB::aaaa);\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但由于以下原因无法编译

\n\n
error: no matches converting function \xe2\x80\x98aaaa\xe2\x80\x99 to type \xe2\x80\x98void (class TESTDB::*)(int, int)\xe2\x80\x99\n   .def_static("aaaa", (void (TESTDB::*)(int, int)) &TESTDB::aaaa);\n note: candidates are: static void TESTDB::aaaa(int)\n static void aaaa(int a) {printf("xxxxx");};\n note:                 static void TESTDB::aaaa(int, int)\n static void aaaa(int a, int b) {printf("aaaaa");};\n
Run Code Online (Sandbox Code Playgroud)\n\n

任何想法?

\n\n

谢谢

\n

Som*_*ude 7

问题是你的演员阵容(void (TESTDB::*)(int, int))。该转换是将指向静态成员函数的指针转换为指向静态成员函数的指针,这是不正确的。

由于函数是静态的,因此您应该简单地将它们转换为指向普通非成员函数的指针:

py::class_<TESTDB>(m, "db")
    .def_static("aaaa", static_cast<void (*)(int, int)>(&TESTDB::aaaa));
Run Code Online (Sandbox Code Playgroud)