概要
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を使う時の書き方について備忘録的にまとめた。
今回はこの辺で。
おわり。