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

如何在Cython中实现对象元组?求完善get_value方法

Cython中实现C++对象元组的接收与返回

代码修正与实现

1. C++侧代码(补充public访问修饰)

#include "Career.h"
#include "Language.h"

using triple_language_ptr = std::tuple<std::shared_ptr<_Language>, std::shared_ptr<_Language>, std::shared_ptr<_Language>>;
    
class _Career{
public:
    std::shared_ptr<_Language> get_language(std::shared_ptr<_Language> value);
    triple_language_ptr get_value(triple_language_ptr value);
};

2. Cython头文件(career.pxd)修正

需用cpptuple对应C++的std::tuple,同时修正笔误:

cdef extern from "Career.h":
    cdef cppclass _Career:
        _Career(...)
        shared_ptr[_Language] get_language(shared_ptr[_Language] value)
        cpptuple[shared_ptr[_Language], shared_ptr[_Language], shared_ptr[_Language]] get_value(
            cpptuple[shared_ptr[_Language], shared_ptr[_Language], shared_ptr[_Language]] value
        )

cdef class Career:
    cdef shared_ptr[_Career] career_ptr

3. Cython实现文件(career.pyx)完善get_value

cdef class Career:
    def __cinit__(...):
        pass

    def get_language(self, value: Language):
        cdef Language py_lang = Language()
        py_lang.lang_ptr = self.career_ptr.get().get_language(value.lang_ptr)
        return py_lang

    def get_value(self, value: tuple[Language, Language, Language]):
        # 提取Python元组中每个Language对象的C++指针
        cdef shared_ptr[_Language] ptr1 = value[0].lang_ptr
        cdef shared_ptr[_Language] ptr2 = value[1].lang_ptr
        cdef shared_ptr[_Language] ptr3 = value[2].lang_ptr
        
        # 组装成C++侧需要的cpptuple
        cdef cpptuple[shared_ptr[_Language], shared_ptr[_Language], shared_ptr[_Language]] cpp_input = (ptr1, ptr2, ptr3)
        
        # 调用C++方法获取结果
        cdef cpptuple[shared_ptr[_Language], shared_ptr[_Language], shared_ptr[_Language]] cpp_result = self.career_ptr.get().get_value(cpp_input)
        
        # 将C++返回的指针包装为Python的Language对象并返回
        cdef Language res1 = Language()
        res1.lang_ptr = cpp_result[0]
        cdef Language res2 = Language()
        res2.lang_ptr = cpp_result[1]
        cdef Language res3 = Language()
        res3.lang_ptr = cpp_result[2]
        
        return (res1, res2, res3)

内容的提问来源于stack exchange,提问作者Punreach Rany

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:32:13