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中重写后会变成更诡异的同一个函数被不同逻辑用不同的参数调用…

  • 相关阅读:
    一条长为L的绳子,一面靠墙,另外三边组成矩形,问此矩形最大面积能是多少?
    幸运的背后,总是靠自身的努力在支撑
    ZT:没有谁的成功是横空出世
    Node.js abaike图片批量下载爬虫1.02
    Node.js nvshens图片批量下载爬虫1.01
    Node.js meitulu图片批量下载爬虫1.051
    JDBC学习再小结
    JDBC学习小结
    day06_JDBC学习笔记
    MySQL学习小结
  • 原文地址:https://www.cnblogs.com/codingmylife/p/3534661.html
Copyright © 2011-2022 走看看