如何使用 Cython 连接返回C++自定义类的函数

How to interface a function that returns a C++ custom class with Cython?

本文关键字:自定义 函数 C++ 返回 何使用 Cython 连接      更新时间:2023-10-16

我有这个C++函数原型:

 Bar & getBar()

其中 Bar 是用户定义的C++类。现在我想以最简单的方式将这个函数与 Cython 接口。

我的 .pyx 文件如下所示:

cdef class PyBar:
   cdef Bar* thisptr 
   (...)
def pygetBar():
   cdef Bar bar = getBar()  
   cdef PyBar pybar = PyBar()
   (*pybar.thisptr) =  bar  # <-- too bad, do not work

无论我尝试什么,我都无法在"thisptr"中复制C++ Bar实例。对于上面的行,我收到此Cython错误消息:

 Cannot assign type 'Bar' to 'Bar *'

我找到的唯一解决方案是定义一个只执行复制的C++帮助程序函数:

void helper_copy_bar(Bar* source, Bar* destination)
{ *destination = *source }

虽然这有效,但每次我只想接口这样一个简单的函数时,创建一个新的C++函数是非常烦人的。文档中一定缺少一些东西。

编辑

我发现了一种具有其他缺点的解决方法:

 def pygetBar():
    cdef Bar * bar = new Bar(getBar())  
    cdef PyBar pybar = PyBar()
    del pybar.thisptr
    pybar.thisptr = bar
    return pybar

它仍然涉及对c ++对象的无用新建/删除,但至少不需要外部函数(对懒惰者有好处)。我仍然想知道哪种解决方案(外部函数或第二个)更好,以及是否有办法在没有外部函数的情况下使用第一个解决方案。

Bar&引用了Bar,它不是指向Bar的指针,尽管在内部,编译器可以将其实现为指针。 简化此操作的最简单方法是编写一个辅助程序 C 函数,我不知道 Cython 对 C++ 有明确的支持? 您的"解决方法"看起来很合适。