2011-05-07 17 views
7

के वेक्टर बूस्ट पायथन में पाइथन के लिए सामान्य वैक्टर का पर्दाफाश करने के लिए मैंने पढ़ा है, लेकिन मैं जानना चाहता हूं कि कैसे वेक्टर का पर्दाफाश करना और उपयोग करना है।बूस्ट पायथन और साझा_ptr

std::vector<shared_ptr<StatusEffect> > Effects; 

वैक्टर उजागर के लिए सामग्री के आधार पर, मैं कक्षा के इस प्रकार का पर्दाफाश करने के लिए सक्षम होना चाहिए: उदाहरण के लिए, मैं shared_ptrs का एक वेक्टर के रूप में निम्नानुसार है। मैं क्या जानना चाहता हूं कि मैं वास्तव में इसे कैसे जोड़ सकता हूं? मैं shared_ptr<StatusEffect> के उदाहरण कैसे बना सकता हूं क्योंकि मेरे पास नई पहुंच नहीं है, और shared_ptr कई व्युत्पन्न प्रकारों को इंगित कर सकता है जो प्रत्येक वर्ग को एक स्थिर निर्माण विधि को थोड़ा कठिन बनाते हैं।

क्या किसी के पास कुछ पॉइंटर्स हैं या यह सुझाव दे सकते हैं कि यह कैसे करें? मुझे क्या करना चाहते हैं के लिए बढ़ावा :: अजगर के लिए अच्छा उदाहरण ढूँढना अग्रिम

उत्तर

1

में abit मुश्किल

धन्यवाद किया गया है एक उदाहरण के लिए Pointers and smart pointers देखें।

+0

हालांकि प्रश्न का उत्तर नहीं देता है। मैं – Megatron

0

आप उल्लेख करते हैं कि प्रत्येक वर्ग के लिए एक सृजन विधि (निर्माता) थोड़ा कठिन होगा, लेकिन मुझे लगता है कि आपको यही चाहिए।

0
struct A { 
    int index; 
    static shared_ptr<A> create() { return shared_ptr<A>(new A); } 
    std::string hello () { return "Just nod if you can hear me!"; } 
}; 

BOOST_PYTHON_MODULE(my_shared_ptr) 
{ 
    class_<A, shared_ptr<A> >("A",boost::python::init<>()) 
     .def("create",&A::create) 
     .staticmethod("create") 
     .def("hello",&A::hello) 
     .def_readonly("index",&A::index) 
    ; 

    boost::python::class_<std::vector<shared_ptr<A>>>("PyVec") 
    .def(boost::python::vector_indexing_suite<std::vector<shared_ptr< A>>,true >()); 

} 

"सत्य" का तर्क महत्वपूर्ण है!

+0

बनाने की आवश्यकता के बिना इसे करने में सक्षम होना चाहता था, मुझे विश्वास है कि यह केवल 'boost :: shared_ptr' के लिए काम करता है और 'std ::' – mavix

0

आप आंशिक रूप से boost::shared_ptr<StatusEffect> को बाध्य कर सकते हैं, निर्माण को छोड़कर बूस्ट के साथ ठीक है। पायथन (boost::python::no_init का उपयोग करें)। std::shared_ptr<StatusEffect> के साथ एक समान तंत्र रखने के लिए आप भीT = std::shared_ptr<U>as explained in this other SO thread के साथ नि: शुल्क फ़ंक्शन को परिभाषित करने की आवश्यकता होगी। यहां एक व्यावहारिक समाधान का एक स्केच है:

#include <boost/python.hpp> 
#include <memory> 
... 

namespace boost { 
    template<class T> T* get_pointer(std::shared_ptr<T> p) { return p.get(); } 
} 

BOOST_PYTHON_MODULE(yourmodule) { 

    using namespace boost::python; 

    class_<StatusEffect, std::shared_ptr<StatusEffect>, boost::noncopyable>("StatusEffect", no_init); 

    class_<std::vector<std::shared_ptr<StatusEffect> > >("StatusEffectVector") 
    .def(boost::python::vector_indexing_suite<std::vector<shared_ptr<StatusEffect>>, true>()); 

} 
संबंधित मुद्दे