在cppclass Cython/C++定义中是否重载了?

Max*_*axB 9 python cython

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++编译器绊倒("错误的参数数量")

Dav*_*idW 6

正如我在评论中所说:这显然是一个错误/不受支持的功能,因此在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)

这使用了两个技巧

  1. Cython允许您通过将其放在引号中为函数指定“实际”名称。因此float sum2 "sum"(int z):最终调用了该函数sum,但是它欺骗了Cython,使其不会在您重用同一个名称时进行注册。但是,自动C ++类型推导将正常工作。

  2. ...(即C varargs)将匹配任何内容,但C ++类型推导机制给出的优先级最低。因此sum(3)挑选sum(int)领先sum(...)。这也使Cython停止了对类型的过分思考,并将其交给了C ++(根据需要)。缺点是,它不会告诉您是否传递了大量的荒谬的参数列表,而只会默默地调用该(...)版本。

这种hack不适用于构造函数,并且对于构造函数来说看起来并不容易。