zoukankan      html  css  js  c++  java
  • SIP:用Riverbank的SIP创建C++库的Python模块

    我们发现PyQt做的Python版的PyQt是如此好用,如果想把自己的C++库包装成Python模块该如何实现呢?

    这里介绍下用SIP包装C++库时值得参考的功能实现:

    • 需要Python模块中实现C++的多态指针类型自动转型为实际类型:

    例如:

    AbstractItem *getItem(); // 这里返回值可能是任何一个子类对象指针,但是在SIP包装后,始终返回AbstractItem对象,并不会根据实际类型自动转型。

    参考QtCore/qcoreevent.sip

    • 为模板类/模板函数生成Python对象/方法:

    例如:

    // 坑爹的模板函数,尤其是这种参数QtAbstractEditorFactory<PropertyManager>对于Python简直是噩梦
    template <class PropertyManager>
    void setFactoryForManager(PropertyManager *manager, QtAbstractEditorFactory<PropertyManager> *factory) {
            QtAbstractPropertyManager *abstractManager = manager;
            QtAbstractEditorFactoryBase *abstractFactory = factory;
    
            if (addFactory(abstractManager, abstractFactory))
                factory->addPropertyManager(manager);
    }

    参考phonon/objectdescription.sip

    • RuntimeError: wrapped C/C++ object of type xxx has been deleted

    遇到这种问题一般是不小心把C++对象的所有权交给了Python,在SIP中有/TransferBack/和/Factory/两种Annotation。可能是本来该由C++负责生命周期的C++对象,误标了这两个标记,去掉多半解决问题。

    • C++中尽量避免把重载接口包装为Python

    用过Python的都懂得,Python里面没有重载,因为Python是动态数据类型,并且支持可变参数。这样把C++的重载接口包装成Python会出现在Python中一个函数用不同的参数调用,行为不同。并且C++的这个重载接口如果是虚函数,在Python中重写后会变成更诡异的同一个函数被不同逻辑用不同的参数调用…

  • 相关阅读:
    JS reduce方法的使用
    面试娱录
    sticky置顶功能影响了锚点定位
    postcss-px-to-viewport移动端自适应
    axios请求参数自动拼接到了地址那里
    ping 不通。无法访问目标主机
    JS前后台方法的相互调用
    SQL server2008 无法连接服务器
    Assembly.Load未能加载文件或程序集“”或它的某一个依赖项。系统找不到指定的文件
    JS判断IE和非IE
  • 原文地址:https://www.cnblogs.com/codingmylife/p/3534661.html
Copyright © 2011-2022 走看看