【问题标题】:swig: how to pass void* into generic function痛饮:如何将 void* 传递给通用函数
【发布时间】:2013-02-19 10:04:48
【问题描述】:

我有一个场景,我需要通过我的 C++ 基于 SWIG(1.3 版)实现的 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 );
    }
    ...
}

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

如果能帮助我找出解决此问题的任何方法,我将不胜感激。

谢谢,

【问题讨论】:

    标签: python pointers interface swig


    【解决方案1】:

    我是否认为您本质上想要某种方法来测试传入的 python 对象是否为“void*”?大概这与测试它是否是指向任何东西的指针相同?

    如果是这样,如何使用 boost::shared_ptr(或其他指针容器)来保存您的通用对象?不过,这将需要一些 C++ 代码重写,因此可能不可行。

    【讨论】:

    • 我需要一种方法来将这些不透明的指针从一个函数中返回,并将其传递给另一个函数。我可能可以切换到使用 noop 删除器返回 shared_ptr,但这对我有什么帮助?
    • 对不起,我想我一定对你想做什么感到困惑。
    • 你能从 PySwigObjects 'ty' 数据字段中得到你想在'line ' 中检查的信息吗?这是一个带有名称字段的“swig_type_info”对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多