我有一个场景,我需要通过基于 SWIG(1.3 版)实现的 C++ <-> Python 接口传递不透明的 void* 指针。我能够在这样的常规函数中返回并接受 void* :
void* foo();
void goo( void* );
当我尝试使用泛型函数做同样的事情时,问题就开始了(这是我真正需要做的)。我能够处理上面的“foo”场景,函数基本上是这样的(从 SWIG 本身为上面的函数 foo 生成的代码中窃取):
PyObject*
foo(...)
{
if( need to return void* )
return SWIG_NewPointerObj(SWIG_as_voidptr(ptr), SWIGTYPE_p_void, 0 | 0 );
}
我不相信这是最好的方法,但它确实有效。“goo”场景要麻烦得多。在这里,我需要处理一些通用输入,而我可以按照 SWIG 本身为上面的函数 goo 生成的代码中的示例实现转换逻辑:
void
goo( PyObject* o )
{
...
if( o is actually void* ) { <==== <1>
void* ptr;
int res = SWIG_ConvertPtr( o, SWIG_as_voidptrptr(&ptr), 0, 0);
if( SWIG_IsOK(res) ) do_goo( ptr );
}
...
}
我没有办法在 <1> 行中实现条件。而对于其他类型,我可以使用以下函数:PyInt_Check、PyString_Check 等,对于 void*,我没有这样做的选项。在 Python 方面,它由 PySwigObject 类型的对象表示,虽然它肯定知道它包装了 void*(如果我打印值,我可以看到它)我不知道如何从 PyObject* 访问这些信息。
我将不胜感激任何帮助找出解决此问题的任何方法。
谢谢,