0

SWIG(バージョン1.3)に基づいて実装されたC ++<->Pythonインターフェースを介して不透明なvoid*ポインターを渡す必要があるシナリオがあります。次のような通常の関数でvoid*を返し、受け入れることができます。

 void* foo();
 void goo( void* );

問題は、ジェネリック関数を使用して同じことを行おうとすると始まります(これが実際に必要なことです)。私は上記の「foo」シナリオを処理することができました。関数は本質的に次のようなことをします(上記の関数fooのためにSWIG自体によって生成されたコードから盗まれました):

PyObject*
foo(...)
{
    if( need to return void* )
        return SWIG_NewPointerObj(SWIG_as_voidptr(ptr), SWIGTYPE_p_void, 0 |  0 );
}

これが最善の方法であるとは確信していませんが、機能します。「goo」シナリオははるかに厄介です。ここでは、いくつかの一般的な入力を処理する必要がありますが、上記の関数gooに対してSWIG自体によって生成されたコードの例に従って変換ロジックを実装できます。

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*からこの情報にアクセスする方法がわかりません。

この問題に対処する方法を見つけ出すのに助けていただければ幸いです。

ありがとうございました、

4

1 に答える 1

0

入ってくる python オブジェクトが「void*」であるかどうかをテストする何らかの方法が本質的に必要だと考えているのは正しいですか? おそらくこれは、何かへのポインタであるかどうかをテストすることと同じですか?

もしそうなら、boost::shared_ptr (または他のポインター コンテナー) を使用してジェネリック オブジェクトを保持するのはどうですか? ただし、これには C++ コードの書き直しが必要になるため、実行できない可能性があります。

于 2013-03-05T06:15:06.580 に答える