2009-12-02 16 views
5

Dada una clase:Boost.Python: Definir un constructor fuera de una clase

class TCurrency { 
    TCurrency(); 
    TCurrency(long); 
    TCurrency(const std::string); 
    ... 
}; 

envuelto con Boost.Python:

class_<TCurrency>("TCurrency") 
    .def(init<long>) 
    .def(init<const std::string&>) 
    ... 
    ; 

¿Es posible crear un método de fábrica que aparece como un constructor en Python:

TCurrency TCurrency_from_Foo(const Foo&) { return TCurrency(); } 

tal que en pitón:

bar = TCurrency(foo) 

Respuesta

12

Puede utilizar make_constructor (no probado):

TCurrency* TCurrency_from_Foo(const Foo&) { return new TCurrency(); } 

class_<TCurrency>("TCurrency") 
    .def("__init__", boost::python::make_constructor(&TCurrency_from_Foo)) 
; 

El argumento para make_constructor es cualquier funtor que devuelve un puntero [1] a la clase envueltos.

[1] En realidad, la función debe devolver un tipo sostenedor del indicador, por lo que si el titular de su puntero es boost::shared_ptr, la función debe devolver un impulso :: shared_ptr en lugar de un puntero en bruto.

0

Puede ser my example te ayuda - la función init_python_object puede tomar cualquier parámetro que necesites. Nota simple: defino class_t con boost::noncopyable and no_init.

Cuestiones relacionadas