2017-03-30 2 views
0

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の両方の初心者ですので、解決策、検索のヒント、適切なリファレンスへの提案などのコメントは非常に高く評価されます。

ありがとうございます!

答えて

1

方法.def("get_vector",&myName::myfoo::get_vector)が動作していない、それはベクトルへのポインタを返すので、それは、オブジェクトの所有権を管理する方法を定義したポリシー通知する必要がありますので:vector_indexing_suiteを使用するためには

class_<myName::myfoo>("myfoo", no_init) 
    // current code 
    .def("get_vector", &myfoo::get_vector, return_value_policy<reference_existing_object>()) 
; 

を、それが必要ですそれが保持しているクラスにequal to operatorを実装する:

struct sFOO 
{ 
    unsigned int start = 3 ; 
    double foo = 20.0 ; 

    bool operator==(const sFOO& rhs) 
    { 
     return this == &rhs; //< implement your own rules. 
    } 
}; 

あなたは、ベクターをエクスポートすることができます。

#include <boost/python/suite/indexing/vector_indexing_suite.hpp> 

class_<std::vector<sFOO>>("vector_sFOO_") 
    .def(vector_indexing_suite<std::vector<sFOO>>()) 
; 
+0

マイナーな編集(ex。 sFOO - > myName :: sFOO)、あなたのソリューションは驚くように機能しました。ありがとう+1 –

関連する問題