簡體   English   中英

暴露std :: vector <struct> 用boost.python

[英]Exposing std::vector<struct> with boost.python

我有一個現有的c ++代碼庫,該庫使用帶有std :: vector的結構,應該將其公開給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;
}
}

對於boost :: 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)
}

(僅供參考,虛擬類dummy3用於模擬名稱空間,因此不能選擇使用范圍。)

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

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

為了規避此問題,我首先嘗試使用vector_indexing_suite,但它無助於公開預定義的struct向量。

我還假定應該有一個與將指針公開給python有關的解決方案,因此我嘗試通過以下方法獲取指針:

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

產生編譯錯誤。

由於我是C ++和Boost的新手,因此,包括解決方案,搜索提示以及適當參考的建議在內的任何評論都將不勝感激。

提前致謝!

方法.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>>())
;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM