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

时间:2019-04-10 13:16:53

标签: python c++ function-pointers member-function-pointers pybind11

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

这是示例代码

#include <pybind11/pybind11.h>

namespace py = pybind11;

class TESTDB {
  public:
    static void aaaa(int a, int b) {printf("aaaaa");};
    static void aaaa(int a) {printf("xxxxx");};
};

PYBIND11_MODULE(example, m) {


  py::class_<TESTDB>(m, "db")
     .def_static("aaaa", (void (TESTDB::*)(int, int)) &TESTDB::aaaa);

}

但由于以下原因未能编译

error: no matches converting function ‘aaaa’ to type ‘void (class TESTDB::*)(int, int)’
   .def_static("aaaa", (void (TESTDB::*)(int, int)) &TESTDB::aaaa);
 note: candidates are: static void TESTDB::aaaa(int)
 static void aaaa(int a) {printf("xxxxx");};
 note:                 static void TESTDB::aaaa(int, int)
 static void aaaa(int a, int b) {printf("aaaaa");};

有什么主意吗?

谢谢

2 个答案:

答案 0 :(得分:1)

问题在于您的演员表(void (TESTDB::*)(int, int))。该强制转换将指向静态成员函数的指针转换为指向 non -静态成员函数的指针,这是不正确的。

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

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

答案 1 :(得分:1)

仅供参考-首先,C ++标准草案n3337(本质上为C ++ 11)的 8.3.1指针[dcl.ptr] / 1

  

在声明T D中,D的形式为

* attribute-specifier-seq cv-qualifier-seq D1
     

,声明T D1中标识符的类型为“ derived-declarator-type-list T”,则D标识符的类型为“ derived-declarator-类型列表 cv-qualifier-seq 指向T的指针。” ...

8.3.3指向成员[dcl.mptr] / 1 状态的指针

  

在声明T D中,D的形式为

nested-name-specifier * attribute-specifier-seq cv-qualifier-seq D1
     

嵌套名称说明符表示一个类,并且声明T D1中的标识符类型为“ derived-declarator-type-list T”。 ,则D的标识符的类型为“ 派生声明器类型列表 cv-qualifier-seq 指向类 nested-name-specifier的成员的指针的类型”。 ...

这些语句意味着,当且仅当函数TESTDB::时,我们才必须在TESTDB::*中使用上述嵌套名称说明符 TESTDB::aaaa是成员函数

接下来, 5.2.2函数调用[expr.call] 状态

  
      
  1. 函数调用有两种:普通函数调用和成员函数 63 (9.3)调用。 ...
  2.   

脚注 63 的位置

  

63 )静态成员函数(9.4)是普通函数

这意味着您的静态成员函数TESTDB::aaaa普通函数 ,而不是成员函数。 因此,您不得在当前演员表中指定TESTDB::


总而言之,您必须像这样消除TESTDB::aaaa的两个重载的歧义:

Live DEMO

static_cast<void (*)(int, int)>(&TESTDB::aaaa)