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

时间:2012-04-25 08:14:58

标签: c++ cython

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

1 个答案:

答案 0 :(得分:0)

酒吧及安培;是引用到Bar,它不是指向Bar的指针,虽然在内部,编译器可以将它实现为指针。最简单的方法是编写一个帮助器C函数,我不知道Cython是否明确支持C ++?你的“解决方法”看起来很合适。