python转c++语言_C++和Python的数据类型的相互转换

本文介绍了如何在C++中使用泛型函数、泛型类和特化来处理与Python之间的数据类型转换。通过自定义数据类型`CustomType`的示例,展示了如何将C++的`std::list`转换为Python的列表,并通过`ToPyConverter`和`ToCppConverter`结构体实现不同数据类型的转换。在`PyInvoker`类中,`Add`泛型函数用于调用Python脚本中的加法操作,实现了对多种数据类型的动态支持。
摘要由CSDN通过智能技术生成

我们都知道,Python本身呢是一门动态语言,变量的类型是在运行时才会被确定的,所以PythonCalc.py脚本中的Add方法呢不仅仅可以满足int型数据相加,同样也能支持其他类型的相加,既然是这样,那在示例工程中的PyInvoker中就没必要也不可能为每一种数据类型都建立一个函数来完成加法功能,所以这里就分享下使用C++的泛型函数,泛型类和泛型特化来完成相应功能。

在PyInvoker这个类里建立一个Add的泛型函数,它使用泛型来支持多种数据类型的调用,同时支持将多种C++基础数据类型转换为Python数据类型,进而来调用PythonCalc.py脚本中的Add方法。

以下是自定义数据类型的相互转化

在Common.h里来定义一个新的数据类型CustomType,它实际上是一个元素类型为std::string的std::list类型。

然后我们在建立了两个CustomType对象One和Two,同时在这两个对象里附上了一些值,将这两个对象作为参数来调用PyInvoker的Add泛型函数,期望的结果时能将两个对象里面的链表合并并返回给C++。

在示例工程里建立了两个头文件,一个是ToPyConverter.h,在其中建立了一个泛型的ToPy的结构体,用来将C++类型转换为Python类型;另一个是ToCppConverter.h,在其中建立了一个泛型的ToCpp的结构体,用来将Python类型转换为C++类型。

我们先来看下泛型ToPy结构体,它的内部呢有一个boost::python::object成员变量obj,这个结构体的作用呢就是将构造函数里传入的C++对象转为为这个boost::python::object成员变量,同时结构体重载了()运算符,从而能将转换好的obj对象提供给Python使用。

对于基础的数据类型,只需要通过构造boost::python::object对象就可以完成C++数据类型到Python数据类型的转换,但是对于向我们定义CustomType这种自定义类型就需要使用泛型特化来做一个特殊的处理。C++中的泛型特化(template specialization)就是针对泛型函数和泛型类中针对特定类型不能通用时所能采取的操作。

在ToPyConverter.h里针对CustomType建立了一个ToPy结构体的泛型特化,用来处理CustomType类型的转化,其实就是实现std::list到PythonList的转化。

泛型ToCpp结构体的内部呢同样有一个boost::python::object成员变量obj,用来存放构造函数里传入的Python类型的对象,结构体重载了()运算符,用来实现Python类型的Obj对象到需要的C++类型对象。

同样,对于基础的数据类型,只需要通过boost::python::extract就可以完成Python数据类型到C++数据类型的转换,对于CustomType这种自定义类型同样需要使用泛型特化来做特殊的处理,其实就是实现PythonList到std:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值