2011-01-31 3 views
0

C++ 객체를 만드는 함수가 있습니다. 리팩터링하기 전에, C++ 함수에서 포인터를 반환하고, 파이썬 포장지 으로 부스트하면, boost::python::return_value_policy<boost::python::manage_new_object>을 사용할 것입니다. 이런 식으로 뭔가 :부울 파이썬에서 튜플의 일부로 반환 된 객체에 대한 반환 정책을 지정하는 방법

MyObject* create_object_from_description(std::string& description) 
{ 
    ... 
    return myObject; 
} 
BOOST_PYTHON_MODULE(pymol) { 
    boost::python::def("create_obj_from_desc", create_object_from_description, 
     (boost::python::arg("description")), 
     "", 
     boost::python::return_value_policy<boost::python::manage_new_object>() 
); 

지금 난 그냥 개체 이상을 반환해야하지만 일부 오류 메시지 및 리팩토링은 기본적으로는 튜플 반환 할 수 있도록하기 위해 C++ 기능을 변경합니다

boost::python::tuple create_object_from_description(std::string& description) 
{ 
    ... 
    return boost::python::make_tuple(myObject, errmsg); 
} 

을 이 변경으로 반품 정책을 어떻게 지정해야합니까?

답변

1

나는 이것이 가능하다고 생각하지 않습니다. 당신이해야 할 일은 함수의 서명을 바꾸고 파이썬에서 함수를 재 포장하는 것입니다. 이처럼 : 물론

def create_object_from_description(description): 
    mo = MyObject() 
    errmsg = pymol.create_object_from_description(description, mo) 
    return mo, errmsg 

, 당신이 정말로 예외를 던져해야하는지 :

boost::python::tuple create_object_from_description(std::string& description, 
                MyObject& myObject) 
{ 
    myObject = mo; 
    return errmsg 
} 

그런 다음 파이썬이 같은 기능을 가지고있다. Boost :: python은 파이썬 예외로 C++ 예외를 돌리는 아주 좋은 작업을 수행합니다.

+0

스마트 포인터를 사용하여 결국이 문제에 대해 걱정하지 않았습니다. –

+0

스마트 포인터를 사용하십시오. 그것도 작동합니다. :-) –