用 Cython 包装 C++ 函数模板

问题描述 投票:0回答:1

我在 .cpp 文件中有一个 C++ 模板定义为

模板 无效

rank_filter(T* in, T* out, int arr_len, int win_len, int order, Mode mode, T cval, int origin)
其中
Mode
是枚举。

this 答案之后,我试图通过 Cython 通过 .pyx 文件将其包装起来:

cimport cython
cimport numpy as np

ctypedef fused numeric_t:
    np.float32_t
    np.float64_t
    np.int32_t
    np.int64_t

@cython.boundscheck(False)  # Deactivate bounds checking
@cython.wraparound(False)  # Deactivate negative indexing.
cdef extern from "_rank_filter_1d.cpp" nogil:
    void rank_filter[T](T* in, T* out, int arr_len, int win_len, int order, Mode mode, T cval, int origin)

def rank_filter_1d(numeric_t[:] in_arr, numeric_t[:] out_arr, int win_len, int order, int mode, numeric_t cval, int origin):
    rank_filter(&in_arr[0], &out_arr[0], in_arr.shape[0], win_len, order, mode, cval, origin)
    return out_arr

不幸的是,在终端中运行

python setup.py build_ext --inplace
会导致错误:

cdef extern from "_rank_filter_1d.cpp" nogil:
    void rank_filter[T](T* in, T* out, int arr_len, int win_len, int order, Mode mode, T cval, int origin)
                           ^
------------------------------------------------------------

rank_filter_1d_cython.pyx:13:27: Expected ')', found 'in'

我尝试在void之前添加

cdef
,但效果不佳。还有其他想法吗?

c++ templates cython
1个回答
0
投票

in
是 Python 关键字,因此不能在 Cython 中用作变量名。

您告诉 Cython 的参数名称没有真正的原因必须与真实的 C 参数名称匹配 - 它们只是用于文档。

惯例可能只是将

in
更改为
in_
以保持意图明显。

© www.soinside.com 2019 - 2024. All rights reserved.