2011-01-31 6 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 
} 

次にpythonでこのような機能を持っている:もちろん

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

を、何が本当にやるべきことは、例外をスローです。 Boost :: pythonは、C++の例外をPythonの例外に置き換えることのとても良い仕事です。

+0

私はスマートポインタを使用して終了し、この問題について心配しなくなりました。 –

+0

スマートポインタを使用してください。それも動作します。 :-) –

関連する問題