std::vector<bool>
クラスメンバをPythonクラスに公開しようと必死です。
これが私のC++クラスです。
class Test
{
public:
std::vector<bool> test_fail;
std::vector<double> test_ok;
};
タイプdouble
(またはint、float、..)のtest_ok
のアクセスと変換は機能しますが、bool
!では機能しません!
Cythonクラスは次のとおりです。
cdef class pyTest:
cdef Test* thisptr
cdef public vector[bool] test_fail
cdef public vector[double] test_ok
cdef __cinit__(self):
self.thisptr = new Test()
self.test_fail = self.thisptr.test_fail # compiles and works if commented
self.test_ok = self.thisptr.test_ok
cdef __dealloc__(self):
del self.thisptr
私が得るエラーは次のとおりです:
Error compiling Cython file:
------------------------------------------------------------
...
cdef extern from *:
ctypedef bool X 'bool'
^
------------------------------------------------------------
vector.from_py:37:13: 'bool' is not a type identifier
私はpython 2.7.6およびCython 0.20.2(0.20.1も試しました)を使用しています。
私もプロパティを試してみましたが、うまくいきません。
補遺: pyxファイルの上部にfrom libcpp cimport bool
があり、ベクターのインポートもあります。
どうしましたか ??これはバグかもしれません。誰もこれを回避する方法を知っていますか?ありがとう。
有効な回避策を見つけましたが、最適ではないかもしれません。
pytest
クラスのメンバータイプをpythonリストで置き換えました。
ドキュメントに記載されているように、変換は暗黙的に行われます。 http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library
すべての変換で新しいコンテナが作成され、そこにデータがコピーされます。コンテナ内のアイテムは、対応するタイプに自動的に変換されます。これには、コンテナ内のコンテナの再帰的な変換が含まれます。文字列のマップのC++ベクトル。
だから今、私のクラスは次のようになります:
cdef class pyTest:
cdef Test* thisptr
cdef public list test_fail #now ok
cdef public list test_ok
cdef __cinit__(self):
self.thisptr = new Test()
self.test_fail = self.thisptr.test_fail # implicit copy & conversion
self.test_ok = self.thisptr.test_ok # implicit copy and conversion
cdef __dealloc__(self):
del self.thisptr
必要な追加のC++サポートがいくつかあります。 .pyxファイルの上部に、追加します
from libcpp cimport bool
Std :: stringやSTLコンテナーなど、必要な他のものを見つけるために、その中を見ていきます
Cythonでboolean
オブジェクトを定義するには、bint
として定義する必要があります。 here :によると、 "boolean int"オブジェクトのbintはc intにコンパイルされますが、ブール値としてCythonとの間で強制変換されます。