如何在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
相关产品推荐
相关产品推荐

