1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Cython チュートリアル: shared_ptr の使い方

Last updated at Posted at 2020-07-11

概要

cythonC++のコードをラップしてpythonから呼べるようにする、

というような内容でいろいろ書きましたが、
今回はcythonでのshared_ptrの書き方を少し解説します。

少しだけ癖がありますが、慣れてしまえば大丈夫です。

コードの構成

いつものように、

  • C++ で書かれたクラス
  • C++ で書かれた関数

を cythonでラップすることで、pythonから呼べるような構成にします。

ここでは例として、

  • C++がTest_CPPというクラスを持っている。
  • C++のTest_CPPがtest_function というメソッドを持っている

ということにします。

実際のコード

おそらく解説されるよりコードをみた方がわかりやすいと思います。
Py_Test_CPPが、Test_CPPをラップしているクラスになります。

test.pyx

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()

必要なもののインポート

まず、
dereferenceshared_ptr, make_sharedを使うのでインポートしています。

C++側のオブジェクトの参照のしかた

この際、プロパティとしてC++側のクラスオブジェクトのポインタを保持している必要がありましたが、
今回はそれをcdef shared_ptr[Test_CPP] ptrと書いてshared_ptrとして保持しています。

コンストラクタ

cython側のコンストラクタである__cinit__では、
make_sharedself.ptr = make_shared[Test_CPP](arg1)
のように使うことで、cython側のself.ptrをシェアドポインタにしています。

関数を呼ぶ

def test_function(self)のところで、C++側の関数test_functionをラップしていますが、
その時はderef(self.ptr)として、実体にアクセスし、そこからC++側の関数を呼ぶことでうまくいきます。

まとめ

cythonshared_ptrを使う時の書き方について備忘録的にまとめた。

今回はこの辺で。

おわり。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?