2014-12-15 2 views
3

У меня есть класс, который я хочу передать shared_ptr. Таким образом, я хочу, чтобы получить построен с заводским способом:boost python make_constructor с аргументами по умолчанию

py::class_<MyClass, boost::shared_ptr<MyClass>>("MyClass") 
    .def("__init__", py::make_constructor(MyClass::factory)) 
; 

Это работало, когда factory() просто взял 2 аргумента. Но теперь я хочу, чтобы взять 2 или 3. Таким образом, я использовал перегрузки макросъемки

BOOST_PYTHON_FUNCTION_OVERLOADS(MyClass_factory_overloads, MyClass::factory, 2, 3) 

Но как я прохожу, что в make_constructor?

ответ

2

Я не думаю, что вам нужно использовать завод, чтобы создать shared_ptr MyClass. Таким образом, просто определить несколько инициализации инструкции:

class Foo { 
public: 
    Foo(int, int) { std::cout << "Foo(int, int)" << std::endl; } 
    Foo(int, int, int) { std::cout << "Foo(int, int, int)" << std::endl; } 
}; 

void test(boost::shared_ptr<Foo>& foo) { std::cout << &(*foo) << std::endl; } 

BOOST_PYTHON_MODULE(mylib) 
{ 
    using namespace boost::python; 

    class_<Foo, boost::shared_ptr<Foo> >("Foo", init<int, int>()) 
     .def(init<int, int, int>()) 
    ; 

    def("test", test); 
} 

Давайте проверим:

import mylib 

c2 = mylib.Foo(1,2) 
Foo(int, int) 

c3 = mylib.Foo(1,1,1) 
Foo(int, int, int) 

mylib.test(c2) 
0x1521df0 

mylib.test(c3) 
0x1314370 

c2a = c2 
mylib.test(c2a) 
0x1521df0 # the object has the same address of c2 
+0

@Barry Я изменил код, чтобы распечатать адрес объекта, так что теперь это более очевидно, что он использует shared_ptr вместо двух разных объектов. –

Смежные вопросы