直接从cython调用C ++ struct构造函数

时间:2017-08-31 23:16:16

标签: python struct cython

我正在尝试包含一些使用带有构造函数的结构的C ++代码,而不是弄清楚如何。

C ++ Struct:

typedef struct point_3d_t
{
    double x;
    double y;
    double z;

    point_3d_t(double x, double y, double z)
        : x(x)
        , y(y)
        , z(z)
        {}

} point_3d;

Cython包装器:

cdef extern from "./cppdar.hpp":
    ctypedef struct point_3d:
        point_3d(double, double, double)
        double x;
        double y;
        double z;

现在,我希望期望能够通过cdef point_3d p1(v, v, v)之类的东西构建结构(来自cython文件中),但我似乎无法弄清楚如何让cython只使用提供的构造函数。

我试过了:

  • cdef point_3d p1(v, v, v)
  • cdef point_3d p1 = point_3d(v, v, v)
  • cdef point_3d p1(0, 0, 0)
  • cdef point_3d p1 = point_3d(0, 0, 0)

其中v是明确的cdef double v = 0,但没有效果。

使用普通cdef point_3d p1p1.x = nnnn等等,但这很烦人,我不明白为什么我不应该使用默认构造函数。我想。 p>

尝试研究这个问题会产生很多与类构造函数相关的混乱,但是没有用。

1 个答案:

答案 0 :(得分:1)

好的,所以答案是你不能在cython中使用构造函数参数堆栈分配C ++对象,基本上

来自:https://groups.google.com/forum/#!topic/cython-users/fuKd-nQLpBs

  

是的,这是一个限制,但它是一个比...更基本的问题   解析器。堆栈分配对象的构造和破坏   C ++与其范围错综复杂,并且范围规则是   Python和C不同。例如,考虑

if some_condition(): 
    x = Foo(1) 
else: 
    x = Foo(2, 3) 
return x.method() 
     

这在C ++中根本无法表达。相反

if (some_other_condition()) { 
    Foo_with_RIAA foo(x) 
} 
... 
     

无法正确翻译"" Python范围规则。

     

现在有些情况可能有意义,但很重要   必须进行代码生成更改,就像目前所有   变量在函数的顶部声明(遵循C89   标准,一些编译器强制执行)但在C ++模式下我们会有   将变量的声明推迟到它的实例化   (包括避免使用任何自动插入的C级{}范围   为了简化代码生成)。

     

因为总是可以在堆上分配这样复杂的对象   不是一个重大的限制。

这太麻烦了,因为这意味着在很多情况下你只是无法包装缺少默认构造函数的类。

可怕的,不好的hacky解决方法是将构造函数包装在一个简单的C(++)函数中,然后通过cython公开