我有这个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 ++对象,但至少不需要外部函数(对懒惰有好处)。 我仍然想知道哪种解决方案(外部功能或第二种解决方案)更好,如果有办法在没有外部功能的情况下使用第一种解决方案。
答案 0 :(得分:0)
酒吧及安培;是引用到Bar,它不是指向Bar的指针,虽然在内部,编译器可以将它实现为指针。最简单的方法是编写一个帮助器C函数,我不知道Cython是否明确支持C ++?你的“解决方法”看起来很合适。