2012-12-21 19 views
14

Próbuję uzyskać Boost Python ładnie grać z std :: shared_ptr. Obecnie otrzymuję ten błąd:Korzystanie z Boost Python & std :: shared_ptr

Traceback (most recent call last): 
    File "test.py", line 13, in <module> 
    comp.place_annotation(circle.centre()) 
TypeError: No to_python (by-value) converter found for C++ type: std::shared_ptr<cgl::Anchor> 

Od wywołania circle.centre(), które zwraca std :: shared_ptr. Mógłbym zmienić każdy std :: shared_ptr na boost :: shared_ptr (z którym ładnie Python ładnie się odtwarza), jednak ilość kodu do zmiany jest całkiem spora i chciałbym użyć standardowej biblioteki.

Metoda koło jest zadeklarowana następująco:

const std::shared_ptr<Anchor> centre() const 
{ 
    return Centre; 
} 

Klasa kotwica tak:

class Anchor 
{ 
    Point Where; 
    Annotation* Parent; 
public: 

    Anchor(Annotation* parent) : 
     Parent(parent) 
    { 
     // Do nothing. 
    } 

    void update(const Renderer& renderer) 
    { 
     if(Parent) 
     { 
      Parent->update(renderer); 
     } 
    } 

    void set(Point point) 
    { 
     Where = point; 
    } 

    Point where() const 
    { 
     return Where; 
    } 
}; 

i odpowiedni kod doładowania Python jest:

class_<Circle, bases<Annotation> >("Circle", init<float>()) 
.def("radius", &Circle::radius) 
    .def("set_radius", &Circle::set_radius) 
    .def("diameter", &Circle::diameter) 
    .def("top_left", &Circle::top_left) 
    .def("centre", &Circle::centre); 

// The anchor base class. 
class_<Anchor, boost::noncopyable>("Anchor", no_init) 
    .def("where", &Anchor::where); 

jestem za pomocą Boost 1.48.0. Jakieś pomysły?

+0

try 'class_ > ("Anchor", no_init)' – kassak

+0

@kassak I” próbowałem tego, ten sam problem. –

+0

Dokumentacja swig ma pewne objaśnienie na temat zawijania inteligentnych wskaźników, które mogą być pomocne. –

Odpowiedz

15

Wygląda na to, że boost :: python nie obsługuje C++ 11 std :: shared_ptr.

Jeśli spojrzeć do pliku Boost/python/konwertera/shared_ptr_to_python.hpp znajdą Państwo realizację funkcji szablon shared_ptr_to_python (shared_ptr <T> const & x) dla boost :: shared_ptr (to wyjaśnić, dlaczego prace kodu dobrze dla boost :: shared_ptr).

myślę, że masz kilka opcji:

  • użycia boost :: shared_ptr (które starają się uniknąć)
  • wyraź swoją realizację shared_ptr_to_python dla std :: shared_ptr (IMHO najlepszy opcja)
  • wyślij zapytanie do boost :: programistów Pythona do wsparcia std :: shared_ptr
+0

https://github.com/boostorg/python/issues/29 Istnieje otwarty bilet związany z obsługą std :: shard_ptr. – maxywb

1

fragment z http://boost.2283326.n4.nabble.com/No-automatic-upcasting-with-std-shared-ptr-in-function-calls-td4573165.html:

/* make boost::python understand std::shared_ptr */ 
namespace boost { 
     template<typename T> 
     T *get_pointer(std::shared_ptr<T> p) 
     { 
       return p.get(); 
     } 
} 

pracował dla mnie. Można by określić swoje zajęcia jak:

class_<foo, std::shared_ptr<foo>>("Foo", ...); 

z tym, inne metody powracający std::shared_ptr<foo> będzie po prostu działać.

Niektóre magie mogą być wymagane w przypadku funkcji wirtualnych/polimorfizmu, które powinny być uwzględnione w wątku, z którym się łączyłem.

Powiązane problemy