gpt4 book ai didi

c++ - 具有 C++ 重载函数的 SWIG 类型映射

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:37:47 28 4
gpt4 key购买 nike

我有一个这样的函数定义:

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;
}

类型映射允许我像这样从 Python 调用 Foo():富((1,2,3))

在我添加一个重载函数之前,它工作得很好,例如:int Foo(双 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 接口(interface)文件中的类型映射函数。 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:\python33\include -link /LIBPATH:c:\python33\libs && 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 [])

关于c++ - 具有 C++ 重载函数的 SWIG 类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14220151/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com