2016-04-12 3 views
2

私はPythonに公開したいC++クラスを持っています。 (このクラスはすでに書かれており、容易に変更できないと仮定します)。このクラスでは、ポインタであるメンバーがあります。そのメンバーも公開したいと思います。ここにコードの最小限のバージョンがあります。理解Boost.Python:ポインタであるクラスメンバーを公開する

>>> c = C("hello") 
>>> c.a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: No to_python (by-value) converter found for C++ type: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >* 

:私はそのフィールドにアクセスしようとしたPythonランタイムエラーが発生していることを除いて

struct C { 
    C(const char* _a) { a = new std::string(_a); } 
    ~C() { delete a; } 
    std::string *a; 
}; 


BOOST_PYTHON_MODULE(text_detection) 
{ 
    class_<C>("C", init<const char*>()) 
     .def_readonly("a", &C::a); 
} 

それは、大丈夫コンパイルされます。しかし、問題は、それは可能性のあるメンバーのポインタaブーストのpythonを介して公開することは可能ですか?そしてどうやって?

ありがとうございます!

答えて

2

def_readonlyの代わりに、add_propertyにカスタムゲッターを使用してください。ゲッターをmake_functionにラップする必要があり、ゲッターがconst&を返すので、return_value_policyも指定する必要があります。

std::string const& get_a(C const& c) 
{ 
    return *(c.a); 
} 

BOOST_PYTHON_MODULE(text_detection) 
{ 
    using namespace boost::python; 
    class_<C>("C", init<const char*>()) 
    .add_property("a", make_function(get_a, return_value_policy<copy_const_reference>())) 
    ; 
} 

Live demo

関連する問題