swig:如何将void *传递给泛型函数

时间:2013-03-05 05:24:56

标签: python pointers interface swig

我有一个场景,我需要通过我的C ++传递opaque void *指针< - >基于SWIG(版本1.3)实现的Python接口。我可以在这样的常规函数​​中返回并接受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 );
    }
    ...
}

我没有办法在行&lt; 1&gt;中实现条件。而对于其他类型,我可以使用如下函数:PyInt_Check,PyString_Check等,对于void *我没有选择这样做。在Python方面,它由具有PySwigObject类型的对象表示,虽然它肯定知道它包装了void *(如果我打印该值,我可以看到它)我不知道如何从PyObject *访问这些信息。

如果您能找到解决此问题的方法,我将不胜感激。

谢谢,

1 个答案:

答案 0 :(得分:0)

我是否正确地认为你基本上想要一些方法来测试传入的python对象是否为'void *'?大概这与测试它是否是指向任何东西的指针相同?

如果是这样,使用boost :: shared_ptr(或其他指针容器)来保存通用对象怎么样?这需要一些C ++代码重写,所以可能不可行。