在cython中返回c++对象(最好不是指针)

2024-10-01 13:43:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个类(假设是最简单的类,实现并不重要)。{cdthon>看起来像是这个文件:

cdef extern from "A.hpp":
  cdef cppclass A:
    A() except +

cdef extern from "B.hpp":
  cdef cppclass B:
    B() except +
    A func ()

我的pyx文件(使用python defs)如下所示:

^{pr2}$

问题是我不能从python返回非python对象。实际上,我不想更改我的c++代码来返回指针而不是新对象(因为有很多类似的函数)。现在它给了我一个错误:

Cannot convert 'B' to Python object

如何从python中的另一个方法返回一个包含内部c++对象的python对象?如果我只能在c++进行一些更改之后才能做到这一点,那么如果可能的话,我想要最优雅的解决方案。在


Tags: 文件对象代码fromexterndefsfunchpp
1条回答
网友
1楼 · 发布于 2024-10-01 13:43:14

您的问题是,包装类需要一个指针(到^ {< CD1>}分配的对象),但是您的函数在堆栈上返回C++对象。要解决这个问题,必须从堆栈中复制或移动对象。

<>首先确保C++类^ {< CD2>}有工作副本或移动构造函数。如果c++类包含大量成员,则移动构造函数更好。把这是赛顿这样:

cdef extern from "A.hpp":
  cdef cppclass A:
    A() except +
    A(const A&) except +
    # or A(A&&) except +

(不要告诉Cython关于复制构造函数和move构造函数的事情-它会混淆的!C++编译时找到正确的一个。

然后,在func中,使用带有new的复制/移动构造函数传递给python包装器:

^{pr2}$

相关问题 更多 >