假设我们将DLL中的接口封装成了C++抽象类,并将该类和DLL文件提供给用户,类似于抽象类导出DLL中描述的办法,如果这个时候我们想使用pybind11绑定这个C++抽象类,会遇到报错,如抽象类无法实例化等等,此时Pybind11给出了辅助类的办法overriding-virtual-functions-in-python,但是如果只想转换C++抽象类的一部分的话,这个方案是不适用的。Pybind11有个很强大的功能,如果我们将C++类使用py::class绑定后,那么C++暴露给python的这个类会自动转换成Python的类。如果我们要大量的在Python中使用到这个C++抽象类且接触不到其基类时,就没有办法完成这个抽象类的绑定。
在这里我们给出一个解决思路,即用Wrapper类将C++的抽象类封装,并对这个类使用pybind绑定,这样我们就有了一个Python端的Wrapper类。再根据官网给出的办法Custom Type Casters实现从Python端Wrapper类到C++抽象类和从C++抽象类到Python端Wrapper类的自动转换。这样当C++暴露给Python这个抽象类时,pybind会自动调用转换器将抽象类转换成Wrapper类的Python对象,当Python的Wrapper类传递给C++时,会将Wrapper类变成C++抽象类。
问题描述