如何在Cython中引用外部声明的typedef std::function类型?
问题:在Cython中导入Callback类型以使用MyClass.DoStuff(无需传递回调参数)
C++头文件声明
typedef std::function<void()> Callback; class MyClass { Result DoStuff(Callback callback = nullptr); void DoStuff2(); }
当前Cython代码(pyx文件)
cdef extern from "header.h" nogil: cdef cppclass MyClass: void DoStuff2()
需求:在Cython中调用MyClass.DoStuff且不传递回调参数,需正确导入Callback类型(即使实际不使用它)。
解决方案
你需要在Cython的外部声明块中,先完成std::function模板实例与Callback类型的映射声明,再补充DoStuff的函数声明。修改后的代码如下:
cdef extern from "header.h" nogil: # 映射std::function<void()>的类型 ctypedef void (*VoidFunc)() cdef cppclass function[T]: pass ctypedef function[VoidFunc] Callback cdef cppclass MyClass: void DoStuff2() # 声明DoStuff函数,使用已定义的Callback类型并保留默认参数 Result DoStuff(Callback callback = nullptr)
注意事项
- 用
VoidFunc函数指针类型匹配std::function<void()>的签名,这是Cython识别C++模板类的必要映射方式。 - 即便不传递回调参数,也必须完整声明
Callback类型,否则Cython无法解析DoStuff的函数签名,编译会报错。 - 如果
Result是自定义类,同样需要在Cython中补充声明(比如cdef cppclass Result:);若是基础类型则直接使用对应Cython类型即可。
内容的提问来源于stack exchange,提问作者EZLearner
相关产品推荐
相关产品推荐

