std :: vectorで構造体を使用する既存のC++コードライブラリがあります。これはPythonに公開する必要があります。ヘッダ内std :: vectorを公開する<struct>とboost.python
:CPPで
struct sFOO
{
unsigned int start = 3 ;
double foo = 20.0 ;
};
:
namespace myName
{
myfoo::myfoo(){
sFOO singlefoo;
std::vector<sFOO> foos;
}
sFOO singlefoo;
std::vector<sFOO>* myfoo::get_vector(){
return &foos;
}
}
ブースト用:: Pythonのスニペット:
using namespace boost::python;
class dummy3{};
BOOST_PYTHON_MODULE(vStr)
{
scope myName = class_<dummy3>("myName");
class_<myName::sFOO>("sFOO")
.add_property("start",&myName::sFOO::start)
.add_property("foo",&myName::sFOO::foo)
;
class_<myName::myfoo>("myfoo", no_init)
.def(init<>())
.def("checkfoo",&myName::myfoo::checkfoo)
.add_property("foos",&myName::myfoo::foos)
.add_property("singlefoo",&myName::myfoo::singlefoo)
}
(FYI、架空のクラスdummy3をするために使用され名前空間をシミュレートし、スコープの使用はオプションではありません)。
コンパイルとインポートのプロセスは正常です。私はsinglefooにアクセスできますが、ベクタにアクセスしようとすると次のエラーメッセージが表示されます。
Python class registered for C++ class std::vector<myName::sFOO,
std::allocator<myName::sFOO> >
この問題を回避するには、 私は、まずvector_indexing_suite試してみたが、それは構造体の事前定義されたベクトルを暴露する助けにはなりませんでした。
私はまたのpythonへのポインタをさらすことに関連したソリューションが存在すべきであると仮定し、私は次のようでポインタを取得しようとしています。エラーをコンパイル生成
.def("get_vector",&myName::myfoo::get_vector)
を。
私はC++とBoostの両方の初心者ですので、解決策、検索のヒント、適切なリファレンスへの提案などのコメントは非常に高く評価されます。
ありがとうございます!
マイナーな編集(ex。 sFOO - > myName :: sFOO)、あなたのソリューションは驚くように機能しました。ありがとう+1 –