pybind11 如何将双指针参数隐式转换为 long 值?

pybind11 how to cast double pointer argument implicitly to long value?

我正在尝试通过 pybind11 向 python 公开带有 classes 的 c++ 库,这些函数成员具有接收双指针参数(用于初始化)的函数成员。

例如:

class IInitializer{
   virtual bool CreateTexture(ITexture **out_pTex, UINT Width, UINT Height) = 0;
}

我知道 pybind11 不支持开箱即用的双指针参数。

在 python 端我想接收 out_pTex 作为长数字或不透明指针。 我不需要在 python 端对这个指针做任何事情,只需将它作为句柄传递给其他 C++ 函数即可。

我试过像这样创建自定义类型施法器:

template <> struct type_caster<ITexture*> : public type_caster_base<ITexture*>
{
using base = type_caster_base<ITexture*>;
public:
PYBIND11_TYPE_CASTER(ITexture*, const_name("ITexture*"));
bool load(handle src, bool) {
    value = reinterpret_cast<ITexture*>(PyLong_AsVoidPtr(src.ptr()));
    return true;
}
static handle cast(ITexture* src, return_value_policy, handle) {
return PyLong_FromVoidPtr((void*)src);
}
};

但我不断收到编译错误,例如:

no known conversion for argument 1 from ‘pybind11::detail::type_caster_base<ITexture>::cast_op_type<ITexture**&&> {aka ITexture*}’ to ‘ITexture**’

有人建议如何将指向某些 class(作为不透明或长数字)的双指针公开给 python?

我会将胶水代码写入 lambda:

IInitializerWrap.def("CreateTexture", [](const IInitializer& self, UINT Width, UINT Height) {
  ITexture* rv;
  self.CreateTexture(&rv, Width, Height);
  return rv; // Or reinterpret_cast if you prefer to.
});