带有c++重载函数的SWIG类型映射
SWIG typemap with C++ overloaded function
我有一个函数定义,像这样:
void Foo(int szData,int Data[]);
,我有一个SWIG类型映射,像这样:
%typemap(in) (int szData,int Data[])
{
int i;
if (!PyTuple_Check($input))
{
PyErr_SetString(PyExc_TypeError,"Expecting a tuple for this parameter");
$1 = 0;
}
else
$1 = PyTuple_Size($input);
$2 = (int *) malloc(($1+1)*sizeof(int));
for (i =0; i < $1; i++)
{
PyObject *o = PyTuple_GetItem($input,i);
if (!PyInt_Check(o))
{
free ($2);
PyErr_SetString(PyExc_ValueError,"Expecting a tuple of integers");
return NULL;
}
$2[i] = PyInt_AsLong(o);
}
$2[i] = 0;
}
typemap允许我像这样从Python调用Foo():Foo((1、2、3)
在我添加一个重载函数之前,它可以很好地工作,例如:int Foo(double t);
一切构建正常,但现在当我从Python调用Foo()时,我得到:
NotImplementedError: Wrong number or type of arguments for overloaded function 'Foo'.
Possible C/C++ prototypes are:
Foo(int,int [])
Foo(double)
如果我删除typemap(in),那么它也可以正常工作。
重命名SWIG接口文件中的类型映射函数。SWIG确实支持多态性,但它在将元组与C类型匹配时存在问题。这是我的界面:
%module demo
%begin %{
#pragma warning(disable:4127 4100 4211 4706)
%}
%{
#include <iostream>
void Foo(int size, int data[]) { std::cout << __FUNCSIG__ << std::endl; }
void Foo(double d) { std::cout << __FUNCSIG__ << std::endl; }
void Foo(int a,int b) { std::cout << __FUNCSIG__ << std::endl; }
void Foo(int a) { std::cout << __FUNCSIG__ << std::endl; }
%}
%typemap(in) (int szData,int Data[])
{
int i;
if (!PyTuple_Check($input))
{
PyErr_SetString(PyExc_TypeError,"Expecting a tuple for this parameter");
$1 = 0;
}
else
$1 = (int)PyTuple_Size($input);
$2 = (int *) malloc(($1+1)*sizeof(int));
for (i =0; i < $1; i++)
{
PyObject *o = PyTuple_GetItem($input,i);
if (!PyInt_Check(o))
{
free ($2);
PyErr_SetString(PyExc_ValueError,"Expecting a tuple of integers");
return NULL;
}
$2[i] = PyInt_AsLong(o);
}
$2[i] = 0;
}
void Foo(int a, int b);
void Foo(double d);
void Foo(int a);
%rename Foo Foot;
void Foo(int szData,int Data[]);
我的构建和测试Visual Studio 2012:
C:Demo>swig -c++ -python demo.i && cl /nologo /LD /W4 /EHsc demo_wrap.cxx /Fe_demo.pyd /Ic:python33include -link /LIBPATH:c:python33libs && python -i demo.py
demo_wrap.cxx
Creating library _demo.lib and object _demo.exp
>>> Foo(1)
void __cdecl Foo(int)
>>> Foo(1,1)
void __cdecl Foo(int,int)
>>> Foo(1.5)
void __cdecl Foo(double)
>>> Foot((1,2,3))
void __cdecl Foo(int,int [])
引自Mark Tolonen的回答
您可以添加到您的demo.i
文件:
%insert("python") %{
FooOld = Foo
def Foo(arg):
if (isinstance(arg,tuple)):
return Foot(arg)
else:
return FooOld(arg)
%}
你会得到名字不变的多态性
相关文章:
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- 在自定义类型图中重用 SWIG 映射
- 为C++重载函数创建SWIG类型映射
- 返回各种类型的函数的SWIG类型映射
- 如何为返回特定类型的函数创建 SWIG 类型图
- 我的 SWIG 类型图有什么问题?
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?
- 指向类的指针的 STL 映射的 SWIG 类型图
- SWIG 类型映射的 python 列表到双倍 *
- SWIG类型映射中的内存释放
- 为 numpy 创建一个简单的 SWIG 类型图
- Python/SWIG类型错误
- 使用SWIG类型映射通过字符串转换类型
- 如何使用 swig 类型映射将 std::vector<std::p air<std::string, int> > 从 java 返回到 c++
- 如何使用P/Invoke使用SWIG类型映射将结构成员从c++编组到c#
- SWIG类型映射中的c++异常
- 从Python中分配SWIG c++类型的数组
- 如何跨swig类型映射重用代码?
- 带有c++重载函数的SWIG类型映射