私はこの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 番目のソリューション) が優れているか、および外部関数を使用せずに最初のソリューションを使用する方法があるかどうかはまだ疑問に思っています。