Cython文档显示了如何使用重载方法声明现有C++类.
但是,如果我cppclass使用重载方法定义自己的...
cdef cppclass point:
float x, y
point():
this.x = 0
this.y = 0
float sum():
return this.x + this.y
float sum(int z): # COMPILE ERROR
return this.x + this.y + z
Run Code Online (Sandbox Code Playgroud)
我明白了
函数签名与先前的声明不匹配
重载构造函数会在那里产生相同的错误:
cdef cppclass point:
float x, y
point():
this.x = 0
this.y = 0
point(float X, float Y): # COMPILE ERROR
this.x = X
this.y = Y
float sum():
return this.x + this.y
Run Code Online (Sandbox Code Playgroud)
我这样做不正确,还是缺少此功能?
更新:默认参数似乎也不可用:
cdef cppclass point:
float x, y
point(float X=0, float Y=0):
this.x = X
this.y = Y
float sum():
return this.x + this.y
cdef float use_point():
cdef point p
p = point(1, 2)
return p.sum()
Run Code Online (Sandbox Code Playgroud)
...通过Cython,但被C++编译器绊倒("错误的参数数量")
正如我在评论中所说:这显然是一个错误/不受支持的功能,因此在github上的Cython问题列表中进行报告可能比在此处发布更为有用。
但是,如果您对hacky的短期工作流程感兴趣,那么可以使用以下方法:
float sum(...):
return this.x + this.y
float sum2 "sum"(int z):
return this.x + this.y + z
# A test function to prove it
def test():
cdef point pt
a = pt.sum()
b = pt.sum(3)
return a,b # returns (0.0, 3.0)
Run Code Online (Sandbox Code Playgroud)
这使用了两个技巧
Cython允许您通过将其放在引号中为函数指定“实际”名称。因此float sum2 "sum"(int z):最终调用了该函数sum,但是它欺骗了Cython,使其不会在您重用同一个名称时进行注册。但是,自动C ++类型推导将正常工作。
...(即C varargs)将匹配任何内容,但C ++类型推导机制给出的优先级最低。因此sum(3)挑选sum(int)领先sum(...)。这也使Cython停止了对类型的过分思考,并将其交给了C ++(根据需要)。缺点是,它不会告诉您是否传递了大量的荒谬的参数列表,而只会默默地调用该(...)版本。
这种hack不适用于构造函数,并且对于构造函数来说看起来并不容易。