Boost.Python:在类外定义构造函数

时间:2009-12-02 19:04:58

标签: constructor factory boost-python

给出一个课程:

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 个答案:

答案 0 :(得分:12)

您可以使用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而不是一个原始指针。

答案 1 :(得分:0)

可能my example可以帮助您 - init_python_object函数可以获取您需要的任何参数。简单说明:我使用boost::noncopyable and no_init定义class_t。