我正在尝试包含一些使用带有构造函数的结构的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 p1
,p1.x = nnnn
等等,但这很烦人,我不明白为什么我不应该使用默认构造函数。我想。 p>
尝试研究这个问题会产生很多与类构造函数相关的混乱,但是没有用。
答案 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公开 。