cython を使用して c++ クラスを python に公開しようとしています。それらの定義を *.pxd ファイルに記述し、*.pyx ファイルにラッパーを実装しました。しかし、拡張型への関数ポインタに渡そうとして行き詰まりました。簡単な例を次に示します。
foo.pyx
from c_foo cimport cFoo
cdef class Foo:
cdef cFoo* _impl
c_foo_holder.pxd
cdef extern from "FooHolder.h":
cdef cppclass cFooHolder:
cFooHolder(cFoo* foo)
foo_holder.pyx
from c_foo_holder cimport cFooHolder
from c_foo cimport cFoo
cdef class FooHolder:
cdef cFooHolder* _impl
def __init__(self, foo):
self._impl = new cFooHolder(<cFoo*>(foo._impl)) # error here
しかし、最後の行で、「Python オブジェクトはプリミティブ型のポインターにキャストできません」というエラーが表示されます。他のいくつかのアプローチも試しましたが、何もうまくいきませんでした:
# error: 'Foo' is not a type identifier
from foo import Foo
def __init__(self, Foo foo):
self._impl = new cFooHolder(foo._impl)
# error: 'Foo' is not a type identifier
def __init__(self, foo):
self._impl = new cFooHolder(<Foo>(foo)._impl)