赞
踩
我们都知道,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:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。