SIP如何处理返回int*的C++方法
我正在尝试把一个C++库变成Python模块。看起来SIP是最合适的工具。(如果我说错了,请纠正我。)
有一个类看起来像是程序员在试图解决C语言没有动态类型的问题:
class Item{
private:
enum ITEMTYPE{TYPE_INT,TYPE_FLOAT,TYPE_INT_ARRAY,TYPE_FLOAT_ARRAY};
enum ITEMTYPE type;
int intValue;
int* intArrayValue;
float floatValue;
float* floatArrayValue;
public:
enum ITEMTYPE getType();
int getItemCount();
int getIntValue();
int* getIntArrayValue();
float getFloatValue();
float* getFloatArrayValue();
...
};
我找不到任何文档说明如何处理返回数组的函数。至少,我希望能从Python调用getIntArrayValue()。更好的是,能有一个Python函数,它可以自动调用getType(),然后再调用某个get???Value()来获取值(如果需要的话,还能调用getItemCount()来确定数组的长度,把数组当作numpy数组或元组来处理)。
我现在的.sil文件看起来是这样的:
class Item{
%TypeHeaderCode
#include<Item.h>
%End
public:
enum ITEMTYPE{
TYPE_INT=0,
TYPE_FLOAT=1,
TYPE_INT_ARRAY=2,
TYPE_FLOAT_ARRAY=3,
};
ITEMTYPE getType();
int getItemCount();
int getIntValue();
//int*getIntArrayValue();
float getFloatValue();
//float*getFloatArrayValue();
};
提前谢谢你。我已经努力寻找,但一直没有找到答案。
2 个回答
0
你可以把你的C++数组转换成Python的列表。在你的.sip文件中:
class Item
{
%TypeHeaderCode
#include<Item.h>
%End
public:
...
SIP_PYLIST getIntArrayValue();
%MethodCode
int iSize = <your array size>; // We assume knowing the array size
sipRes = PyList_New(iSize);
for(int i=0; i<iSize; ++i)
PyList_SetItem(sipRes, i, PyLong_FromLong(sipCpp->intArrayValue[i]));
%End
};
0
我对sip不太了解,但我用过swig把C++代码封装成Python模块,这个过程相当简单。swig可以自动处理大多数标准的C++数据类型(包括标准库中的容器)。