2011-01-31 64 views
0

我有一個函數可以創建一個C++對象。在重構之前,我從C++函數返回一個指針,並且在boost python wrapper 聲明中,我將使用boost::python::return_value_policy<boost::python::manage_new_object>。事情是這樣的:如何在boost python中爲返回的對象指定返回策略

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

我不認爲這是可能的。你可能需要做的是改變函數簽名並重新包裝python中的函數。就像這樣:

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

然後在蟒蛇有這樣的功能:

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

當然,你應該真的是拋出一個異常。 Boost :: python在將python異常轉換爲python異常方面做得非常好,反之亦然

+0

我結束了使用智能指針並停止擔心這個問題。 – 2011-02-02 05:32:13