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

  • 相关阅读:
    [CF1336C] Kaavi and Magic Spell
    [CF1338C] Perfect Triples
    [CF1353F] Decreasing Heights
    [CF1442B] Identify the Operations
    [CF1354E] Graph Coloring
    [CF1364D] Ehab's Last Corollary
    php-fpm和fastcgi的区别
    phpredis实现互斥锁
    关于lnmp情况下PHP单线程的理解
    客户端断开链接以后 PHP执行过程实测
  • 原文地址:https://www.cnblogs.com/codingmylife/p/3534661.html
Copyright © 2020-2023  润新知