You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:49:57