Python 直接调用C++;来自cython的结构构造函数
我试图用构造函数包包一些使用结构的C++代码,而不知道如何使用.< /p> C++结构:Python 直接调用C++;来自cython的结构构造函数,python,struct,cython,Python,Struct,Cython,我试图用构造函数包包一些使用结构的C++代码,而不知道如何使用.< /p> C++结构: 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 ext
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\u 3d p1(v,v,v)
(从cython文件中)的方式构造结构,但我似乎不知道如何让cython只使用提供的构造函数
我试过:
cdef点\u 3d p1(v,v,v)
cdef点3d p1=点3d(v,v,v)
cdef点\u 3d p1(0,0,0)
cdef point\u 3d p1=point\u 3d(0,0,0)
v
是一个显式的cdef双v=0
,但不起作用
使用普通的cdef point_3d p1
,p1.x=nnnn
,等等,但这很烦人,我不明白为什么我不能使用默认构造函数,我想
试图研究这个问题会产生很多与类构造函数相关的杂波,这没有什么帮助。
< P> OK,所以答案是,不能用Cython中的构造函数参数来堆叠分配C++对象,基本上是: 发件人: 是的,这是一个限制,但这是一个比 解析器。中堆栈分配对象的构造和销毁 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级{}作用域)
为了简化代码生成)
由于总是可以在堆上分配这样复杂的对象,因此
这不是一个很大的限制
这是额外的双重加上恼人的,因为这意味着您在许多情况下无法包装缺少默认构造函数的类
可怕的,没有好的黑客解决方法是将构造函数包装在一个简单的C(++)函数中,然后通过cython公开它 我不确定我是否理解你的工作循环会给你带来什么?我想你仍然需要一个默认的构造函数。@DavidW-是的,你仍然需要一个构造、构造和移动过程,但这比作为默认值实例化要好得多,然后分别设置成员。我相信Cython可以先构造然后复制分配/移动分配:
cdef point\u 3d p
然后p=point\u 3d(…)
。您可能需要告诉它有关默认构造函数以及您使用的构造函数的信息。@DavidW-是的,但我正在尝试删除默认构造函数,因为我希望能够避免意外地出现未初始化的实例。