2016-04-12 25 views
2

Python'a maruz kalmak isteyen bir C++ sınıfına sahibim. (Bu sınıfın zaten yazıldığı ve kolayca değiştirilemeyeceği varsayılarak). Bu sınıfta, bir işaretçi olan bir üye var ve bu üyeyi de açığa çıkarmak istiyorum. İşte kodun en az bir versiyonu. anlaşılabilirBoost.Python: bir işaretçi olan sınıf üyesini gösterme

>>> 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> >* 

: Ben bu alanı erişmeye çalışan bir piton çalışma zamanı hata olduğunu haricinde

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); 
} 

O tamam derler. Ancak soru şu ki üye işaretçi a destek boostu ile ortaya çıkarmak mümkün mü? Ve nasıl?

Çok önceden teşekkürler!

cevap

2

def_readonly kullanmak yerine, özel bir alıcıyla add_property kullanın. Alıcının make_function'a sarılması ve alıcının bir const& döndüğünden, bir return_value_policy belirtmeniz gerekir.

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

İlgili konular