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

0 投票
1 回答
676 浏览
提问于 2025-04-17 17:58

我遇到一个情况,需要在我的C++和Python接口之间传递一些不透明的void*指针,这个接口是用SWIG(版本1.3)实现的。我可以在普通函数中像这样返回和接受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*访问这些信息。

如果有人能帮我想出解决这个问题的方法,我将非常感激。

谢谢,

1 个回答

0

我理解你是想找一种方法来测试传入的Python对象是不是一个'void*'类型的指针,对吧?这大概就是在检查它是否是指向某个东西的指针?

如果是这样的话,为什么不试试用boost::shared_ptr(或者其他指针容器)来保存你的通用对象呢?不过这样做可能需要重新写一些C++代码,所以可能不太实际。

撰写回答