1

我正在尝试包装一个 cpp 应用程序,并且源代码在头文件中包含以下内容

using Time = cppClassDefinition<withT>

...

void setDefaultTime(Time x)

什么是 Cython 等价物?

我试过了

cdef extern from "headerfile.h" namespace "ns":
    ctypedef cppClassDefinition<withT> Time

没有成功。虽然 Cython 在这一步没有抱怨,但当我尝试使用该函数时它会引发编译错误setDefaultTime(1.0)。错误状态“无法将类型 'double' 分配给 'Time'。然而,在 CPP 代码中,这似乎工作正常。

我也试过

cdef extern from "headerfile.h" namespace "ns":
    cdef cppclass Time:
        pass

这也失败了。有什么建议么?这可以使用 Cython 吗?

4

1 回答 1

1

正如您在问题中所建议的那样,您应该可以使用

ctypedef cppClassDefinition[withT] Time

因为using ... = ...在这种情况下等价于 a typedef。(注意与问题中的代码相比,方括号的变化)。

我相信问题在于您尝试做setDefaultTime(1.0). Cython 无法知道double可以转换为Time,也没有任何方法可以告诉它隐式 C++ 转换。

最简单的方法是告诉 Cython 函数签名是

void setDefaultTime(double x)

(您可以保持 C++ 签名不变)。这将满足 Cython,然后它生成的 C++ 代码最终应该可以正常工作,前提是double可以隐式转换为Time(正如问题所暗示的那样)

于 2017-03-31T19:32:52.687 回答