Swig:SWIG_NewPointerObj和Typemaps

时间:2015-07-22 15:14:51

标签: c++ swig

我正在使用Qt-Application,我使用Swig为我的公共API生成Python绑定。

我尝试在SWIG中实现信号/插槽,并将python嵌入到我的最终应用程序中。最后,它总是归结为一个简单的功能,SWIG似乎错过了或者我还没有找到它:

PyObject* createPyObject(QString typeName, bool passOwnership, void* obj)

要求

该函数应该从传递的obj创建一个PyObject。 typeNameobj指向的实例的类型,passOwnership指定对象是否应该由Python解释器拥有。该功能应该:

  1. 为传递的类型应用 out -Typemap(如果存在)
  2. 否则将对象包装为"类型的Swig代理对象..."如果可能的话
  3. 如果这也不可能,它应该返回一个" Swig对象类型......"
  4. 实施例

    我们说我有三个班级:

    • class A1我有 out -Typemap从此类的实例转换为 Python-Integers
    • class A2我有 out -Typemap从此类的实例转换为 Python-Tuples
    • 我使用SWIG接口文件包装的
    • class B
    • class C,SWIG完全不知道。

    然后createPyObject应该

    • 如果调用PyIntObject*
    • ,则返回createPyObj("A1",true,new A1())
    • 如果调用PyTupleObject*
    • ,则返回createPyObj("A2",true,new A2())
    • 如果调用proxy of <Swig Object of Type 'B*'>
    • ,则返回createPyObj("B",true,new B())
    • 如果调用Swig Object of Type 'C*'
    • ,则返回createPyObj("C",true,new C())

    总结一下: 我希望返回的PyObject的构造就好像它是一个使用SWIG接口文件包装的函数的返回值。

    我目前的实施

    PyObject* createPyObject(QString typeName, bool passOwnership, void* obj) {
    
        typeName += " *"; //Pointer symbol
        swig_type_info* info = SWIG_TypeQuery(typeName.toStdString().c_str());
    
        if (info == nullptr) return nullptr;
    
        return SWIG_NewPointerObj(obj, info, passOwnership ? SWIG_POINTER_OWN : 0);
    }
    

    这适用于不需要类型映射且SWIG已知的类型(需求中的第2点)。但它不适用于需要类型图的类型。

    您能否为我提供createPyObject的正确实施?我的意思是说,符合上面列出的所有要求。

0 个答案:

没有答案