概要
cython
でC++
のコードをラップしてpython
から呼べるようにする、
というような内容でいろいろ書きましたが、
今回はcython
でのshared_ptr
の書き方を少し解説します。
少しだけ癖がありますが、慣れてしまえば大丈夫です。
コードの構成
いつものように、
C++ で書かれたクラス
C++ で書かれた関数
を cython
でラップすることで、python
から呼べるような構成にします。
ここでは例として、
C++がTest_CPPというクラスを持っている。
C++のTest_CPPがtest_function というメソッドを持っている
ということにします。
実際のコード
おそらく解説されるよりコードをみた方がわかりやすいと思います。
Py_Test_CPP
が、Test_CPP
をラップしているクラスになります。
from cython.operator cimport dereference as deref
from libcpp.memory cimport shared_ptr, make_shared
cdef class Py_Test_CPP:
cdef shared_ptr[Test_CPP] ptr
def __cinit__(self, int arg1):
self.ptr = make_shared[Test_CPP](arg1)
def test_function(self):
return deref(self.ptr).test_function()
必要なもののインポート
まず、
dereference
、shared_ptr, make_shared
を使うのでインポートしています。
C++側のオブジェクトの参照のしかた
この際、プロパティとしてC++
側のクラスオブジェクトのポインタを保持している必要がありましたが、
今回はそれをcdef shared_ptr[Test_CPP] ptr
と書いてshared_ptr
として保持しています。
コンストラクタ
cython側のコンストラクタ
である__cinit__
では、
make_shared
をself.ptr = make_shared[Test_CPP](arg1)
のように使うことで、cython側のself.ptrをシェアドポインタ
にしています。
関数を呼ぶ
def test_function(self)
のところで、C++側の関数test_function
をラップしていますが、
その時はderef(self.ptr)
として、実体にアクセスし、そこからC++側の関数を呼ぶ
ことでうまくいきます。
まとめ
cython
でshared_ptr
を使う時の書き方について備忘録的にまとめた。
今回はこの辺で。
おわり。