Cython C ++模板

Mat*_*und 5 c++ python templates cython

我对cython相当陌生,并且尝试包装定义为

template < typename T, uint N >   
struct Vector{}
Run Code Online (Sandbox Code Playgroud)

而且我很难了解cython如何使用模板,尤其是那些以int为参数的模板。我在文档中读到,尚不支持将int作为模板参数。如何正确执行此操作?

Mat*_*und 5

我找到了一个简单的解决方案!

在 C++ 头文件中,您可以只声明一个 typedef,例如

typedef Vector<float,3>; Vector3f;
Run Code Online (Sandbox Code Playgroud)

在您的 cython 文件中,您可以声明这一点,现在您可以使用类中的所有函数和运算符。

cdef extern from "Vector.h" namespace "ns":
    cdef cppclass Vector3f:
Run Code Online (Sandbox Code Playgroud)

现在,我遇到了一个额外的问题,那就是“专门”函数,在我的例子中,是具有 3 个参数的 Vector 的专门化。

template<typename T1, typename T2>
inline Vector<T1, 3 >Cross(const Vector <T1, 3 > & v1, const Vector<T2, 3> & v2)
Run Code Online (Sandbox Code Playgroud)

要在 cython 中使用它,只需在类之外声明它,在我的例子中

cdef extern from "Vector.h" namespace "ns":

    cdef cppclass Vector3f:

        ...

    Vector3f Cross(Vector3f v1,Vector3f v2)
Run Code Online (Sandbox Code Playgroud)


col*_*onz 5

出于好奇,Cython wiki展示了如何在 Cython 中编写模板化类:

cdef extern from "<vector>" namespace "std":
    cdef cppclass vector[T]:
        ...
Run Code Online (Sandbox Code Playgroud)

此外,多个模板参数被定义为一个列表。要回答 OP 的问题,可以使用cdef struct Vector[T, N].