如何将 python 派生类作为指针传递给 C++ API 调用?

问题描述 投票:0回答:0

我正在使用 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 类型为‘回调’*’

python c++ inheritance swig
© www.soinside.com 2019 - 2024. All rights reserved.