我有这个 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++ 对象的新建/删除,但至少不需要外部函数(对懒惰的人有好处)。我仍然想知道哪种解决方案(外部函数或第二个)更好,以及是否有办法在没有外部函数的情况下使用第一个解决方案。