Boost.Python: определение конструктора вне класса - PullRequest
5 голосов
/ 02 декабря 2009

Учитывая класс:

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

Завернутый с Boost.Python:

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

Возможно ли создать фабричный метод, который появляется как конструктор в Python:

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

такой, что в python:

bar = TCurrency(foo)

Ответы [ 2 ]

12 голосов
/ 22 января 2010

Вы можете использовать make_constructor (не проверено):

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

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

Аргументом make_constructor является любой функтор, который возвращает указатель [1] на упакованный класс.

[1] На самом деле функция должна возвращать тип держателя указателя, поэтому, если ваш держатель указателя boost::shared_ptr, функция должна возвращать boost :: shared_ptr вместо необработанного указателя.

0 голосов
/ 11 декабря 2009

Может быть мой пример вам поможет - функция init_python_object может принимать любые параметры, которые вам нужны. Простое примечание: я определяю class_t с boost::noncopyable and no_init.

...