2017-03-30 68 views
0

我有一個現有的C++代碼庫,它使用std :: vector的結構,它應該暴露給python。暴露std :: vector <struct> with boost.python

在頭

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

namespace myName 
{ 
myfoo::myfoo(){ 
    sFOO singlefoo; 
    std::vector<sFOO> foos; 
} 
sFOO singlefoo;    

std::vector<sFOO>* myfoo::get_vector(){ 
    return &foos; 
} 
} 

和升壓::蟒片段:

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

(僅供參考,虛擬類dummy3用於模擬命名空間,因此使用範圍不是一種選擇。)

編譯和導入過程都可以,我可以訪問singlefoo,但每當我嘗試訪問vector foos時,都會遇到下面的錯誤消息。

Python class registered for C++ class std::vector<myName::sFOO, 
std::allocator<myName::sFOO> > 

爲了規避這個問題, 我首先嚐試vector_indexing_suite,但它並沒有幫助暴露結構的預先定義的載體。

我也認爲應該有相關的暴露指針蟒蛇的解決方案,所以我試圖通過以下獲取一個指針:

.def("get_vector",&myName::myfoo::get_vector) 

產生編譯錯誤。

因爲我對C++和Boost都是新手,所以任何意見,包括解決方案,搜索提示和合適的參考建議都將不勝感激。

在此先感謝!

回答

1

方法.def("get_vector",&myName::myfoo::get_vector)不工作,因爲它返回一個指向矢量,所以通知定義對象的所有權應該如何管理的政策,這是必要的:

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

爲了使用vector_indexing_suite,有必要實施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

小修改後(例如。 sFOO - > myName :: sFOO),你的解決方案就像一個奇蹟。非常感謝+1 –

相關問題