我正在使用 SWIG 在 Python 中公开我的 C++ API。 我的 C++ API 需要一个回调包装器类指针 'A'*, 我希望我的客户(只使用 Python)能够从包装类“A”继承并传递他对该类的实现“B”。 (我朝那个方向走,因为我看到 SWIG 在将回调传递给函数方面存在一些问题......)。
所以我在 Python 中定义了类“B”并实例化了它,问题是如果我尝试将对象按原样传递给函数,我会得到一个类型错误(我认为 SWIG 无法将对象转换为共享指针,如果它是在 Python 代码中定义)。 那么如何创建一个指向我在 Python 中定义的继承自 C++ 类的对象的指针呢?有可能吗? 我考虑过创建一个指向基类的指针并告诉它指向 Python 对象,但我也不确定如何实现......
我是 SWIG 的新手,我想要完成的事情有可能实现吗?我是否错过了一个更简单更优雅的解决方案?提前致谢。
//Callback.cpp
class DLL_EXPORT Callback
{
public:
virtual void handle(std::shared_ptr<Data> data) {};
virtual ~Callback() {}
};
class DLL_EXPORT Handler: public IHandler
{
public:
Handler(std::shared_ptr<Callback> callback)
: m_callback(callback)
{}
void handle(std::shared_ptr<Data> data) override
{
m_callback->handle(data);
}
private:
std::shared_ptr <Callback> m_callback;
};
//interface.i
%module(directors="1") example
%shared_ptr(Callback)
%feature("director") Callback;
%inline %{
std::shared_ptr<Handler> createHandler(std::shared_ptr<Callback> callback)
{
return std::shared_ptr<Handler>(new Handler(callback));
}
%}
//Client.py
class DummyCallback(example.Callback):
def __init__(self):
pass
def handle(self, frameData):
print("callback called")
return
...
cb = DummyCallback()
handler = example.createHandler(cb) # <-- I get a type error here.
我尝试创建一个原始指针,但我不知道如何告诉它指向我创建的对象, 或者如果有可能的话。 我一般阅读了类型映射和 SWIG 文档,但看不到任何亮点。
更新 1: 我还尝试将其添加到 .cpp 文件中
std::shared_ptr<Callback> makeShared()
{
return std::shared_ptr<Callback>(this);
}
但这会导致类型错误:“参数 1 类型为‘回调’*’