2016-04-25 2 views
1

Ich habe mir alle verwandten Fragen angesehen, die ich finden konnte und konnte keine Antwort auf diese spezielle Situation finden.boost :: python pure virtuelle Basisklasse mit statischem Factory-Konstruktor und std :: unique_ptr

Ich habe eine reine C++ - Basisklasse-Schnittstelle, die ich Python bereitstellen möchte. Die Implementierung erbt von Basis und ist nicht ausgesetzt:

struct Base : private boost::noncopyable 
{ 
    static std::unique_ptr<Base> create(); 
    virtual ~Base(); 
    virtual int get_int() = 0; 
    virtual void set_int(const int i) = 0; 
}; 

Ich brauche Python nicht Base zu Unterklasse, nur in der Lage sein, neue Basis Instanzen durch die create() Fabrik Funktion zu konstruieren.

Ich habe zwei Ansätze zum Umbruch mit boost :: python ausprobiert. Erstens, ähnlich wie Boost.Python: How to expose std::unique_ptr Ich habe versucht, eine __init__ Funktion zu erstellen, die die unique_ptr veröffentlicht:

namespace bp = boost::python; 
bp::class_<Base, boost::noncopyable>("Base", bp::no_init) 
    .def("__init__", 
     bp::make_function([](Base& self) { return Master::create().release(); }, 
     bp::return_value_policy<bp::manage_new_object>(), 
     boost::mpl::vector<Base*, Base&>(), "Create a new Base") 
    .staticmethod("__init__") 

Dies kompiliert und lädt in Python, aber __init__ ist eigentlich nicht statisch!

create(...) 
create((Base)arg1) -> Base : 
    Create a new Base 

    C++ signature : 
     Base* create(Base {lvalue}) 

Der zweite Ansatz, den ich ist versucht make_constructor wie folgt zu verwenden:

namespace bp = boost::python; 
bp::class_<Base, boost::noncopyable, std::unique_ptr<Base>>("Base", bp::no_init) 
    .def("__init__", bp::make_constructor(&Base::create)); 
bp::register_ptr_to_python<std::unique_ptr<Master>>(); 

jedoch diese nicht kompiliert: /usr/include/boost/python/make_constructor.hpp:40:20: fatal error: call to deleted constructor of std::unique_ptr<Base, std::default_delete<Base>> dispatch(x, is_pointer<T>());

Antwort

0

Ich war in der Lage, die Bindungen zu machen arbeiten, um die zweite mit Vorgehensweise, indem Sie von std :: unique_ptr zu std :: shared_ptr wechseln, da shared_ptr standardmäßig konstruierbar ist.

Dies war möglich, weil ich in der Lage bin, die Quelle der C++ - Bibliothek zu ändern.

Verwandte Themen