如何从另一个包装对象返回Cython中包裹的C++对象?

2024-05-13 20:42:08 发布

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

我一直用Cython包装C++类。现在我有以下问题:A类有一个方法FoE(),它返回类B的实例,两个都是C++类。它们都用Cython包装到类PyA和PyB。让用户可以访问的方法_对象.foo()并获取一个PyB\u对象。如何实现该方法?在

cimport cppClassA

cdef class A:
    cdef cppClassA.A *ptr
    ...
def foo():
    return self.ptr.foo()

这样,我返回了直接C++类B,但是我想返回一个PYB。因此,我需要创建一个PyB对象,但是如何构造PyB的cinit()方法呢?如何从self.ptr.foo()返回一个新的PyB对象并返回它?在


Tags: 对象实例方法用户selffoocythonclass
1条回答
网友
1楼 · 发布于 2024-05-13 20:42:08

从您的问题中不完全清楚foo是否通过指针或值返回(即它是否具有签名B* foo()还是B foo())。你要做什么取决于这个-我已经展示了两者。在

我认为你遇到的问题是^ {{CD4>}或^ {CD5>}方法的^ {< CD6>}只能以Python对象作为参数,所以你无法通过C++ ^ ^ {CD7>}对象。解决方案是创建一个空的或{“C++”对象为^ {CD9}}的^ {< CD6}},然后替换它。在

< C++代码的包装看起来像这个

cdef extern from "somefile.hpp":
    cdef cppclass A:
        B foo1()
        B* foo2()

    cdef cppclass B:
        # only need to provide these for foo1_alternative
        B()
        B(const B&)

注意,我提供了两个版本的foo-foo1,它按值返回,而{}返回指针。在

Python B持有者(PyB)看起来像

^{pr2}$

我提供了一个可选的make_ptr参数,您可以将其设置为False,以避免将self.ptr设置为任何值。在

Python的A持有者(PyA)是

cdef class PyA:
    cdef A* ptr

    # code goes here

    def foo1(self):
        cdef PyB val = PyB()
        val.ptr[0] = self.ptr.foo1() # use move (or copy) assignment operator

    def foo1_alternative(self):
        cdef PyB val = PyB(make_ptr=False)
        val.ptr = new B(self.ptr.foo1()) # use move (or copy) constructor

    def foo2(self):
        cdef PyB val = PyB(make_ptr=False)
        val.ptr = self.ptr.foo2()

对于返回指针的foo2,只需创建一个空的PyB,并将返回的Foo*分配给self.ptr。对于foo1您有两个选项,其中一个选项涉及创建一个PyB,然后使用move(或copy)赋值运算符复制数据。第二个选项涉及创建一个空的PyB,然后使用B的move(或copy)构造函数创建一个B*。在

<>你最好使用移动构造函数,而不是复制构造函数,但是你不需要告诉Cython,(C++会自动选择正确的)。在

相关问题 更多 >