2

私はこのC++関数プロトタイプを持っています:

 Bar & getBar()

ここで、Bar はユーザー定義の C++ クラスです。ここで、この関数を Cython とできるだけ簡単な方法でインターフェースさせたいと思います。

私の .pyx ファイルは次のようになります。

cdef class PyBar:
   cdef Bar* thisptr 
   (...)

def pygetBar():
   cdef Bar bar = getBar()  
   cdef PyBar pybar = PyBar()

   (*pybar.thisptr) =  bar  # <-- too bad, do not work

何を試しても、「thisptr」に C++ Bar インスタンスをコピーできません。上記の行について、次の Cython エラー メッセージが表示されます。

 Cannot assign type 'Bar' to 'Bar *'

私が見つけた唯一の解決策は、コピーを行うだけの C++ ヘルパー関数を定義することです。

void helper_copy_bar(Bar* source, Bar* destination)
{ *destination = *source }

これは機能しますが、そのような単純な関数をインターフェースしたいだけで、毎回新しい C++ 関数を作成するのはかなり面倒です。ドキュメントに欠けているものがあるに違いありません。

編集

他の欠点がある回避策を見つけました:

 def pygetBar():
    cdef Bar * bar = new Bar(getBar())  
    cdef PyBar pybar = PyBar()
    del pybar.thisptr
    pybar.thisptr = bar

    return pybar

これには、C++ オブジェクトの無駄な新規作成/削除が含まれますが、少なくとも外部関数は必要ありません (怠け者には適しています)。どちらのソリューション (外部関数または 2 番目のソリューション) が優れているか、および外部関数を使用せずに最初のソリューションを使用する方法があるかどうかはまだ疑問に思っています。

4

1 に答える 1

0

Bar& はBar への参照であり、Bar へのポインターではありませんが、内部的にコンパイラーはそれをポインターとして実装する場合があります。これを単純化する最も簡単な方法は、ヘルパー C 関数を作成することです。Cython が C++ を明示的にサポートしていることを知りませんか? あなたの「回避策」は適切に見えます。

于 2012-05-28T00:58:42.933 に答える