2

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

4

1 回答 1

0

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

于 2012-05-28T00:58:42.933 回答