2012-05-14 19 views
5

मैं एक विधि (या समारोह) जो बहुरूपी वस्तुओं की एक सूची के लिए एक संदर्भ रिटर्न है:बूस्ट पायथन: पॉलिमॉर्फिक कंटेनर?

class A { 

}; 
class B : public A { 

}; 


std::list<boost::shared_ptr<A> >& getList(); 

मैं कैसे :: अजगर को बढ़ावा देने में इस तरह के एक समारोह का पर्दाफाश करते ताकि जब अजगर में सूची पर पुनरावृत्ति, मैं विभिन्न प्रकार के A एस और B एस देखता हूं?

उत्तर

4

सबसे पहले, सुनिश्चित करें कि आपकी कक्षाएं वास्तव में बहुलक हैं (यानी उनके पास कम से कम एक वर्चुअल फ़ंक्शन या आभासी विनाशक है)। उपरोक्त आपका उदाहरण नहीं है, हालांकि मुझे यकीन है कि आपका असली उपयोग केस करता है। इसके बिना बूस्ट में से कोई भी नहीं। पॉलिमॉर्फिज्म के लिए पाइथन की आरटीटीआई-आधारित मशीनरी काम करेगी।

तब, यदि आप Boost.Python साथ दोनों वर्गों अवगत कराया और उनके लिए shared_ptr कन्वर्टर्स पंजीकृत कर लिया है:

#include <boost/python.hpp> 

namespace bp = boost::python; 

BOOST_PYTHON_MODULE(example) { 
    bp::class_<A >("A"); 
    bp::register_ptr_to_python< boost::shared_ptr<A> >(); 
    bp::class_< B, bp::bases<A> >("B"); 
    bp::register_ptr_to_python< boost::shared_ptr<B> >(); 
} 

... कि सभी आप वाकई अजगर बनाने के लिए क्या करने की जरूरत है ही कभी most- देखता है व्युत्पन्न प्रकार। A को B पर संभव होने पर सुनिश्चित करने के लिए कुछ भी करने की आवश्यकता नहीं है।

यह अभी भी एक कंटेनर लौटने वाले फ़ंक्शन को लपेटने का सवाल छोड़ देता है। सबसे सरल शायद अनुक्रमण सूट Boost.Python के साथ शामिल उपयोग करने के लिए है:

http://www.boost.org/doc/libs/1_49_0/libs/python/doc/v2/indexing.html

वहाँ एक अनुक्रमण सूट है कि कई मामलों में बेहतर है की "संस्करण 2" सहित अन्य विकल्पों वेब के आसपास चल (कर रहे हैं, लेकिन Boost.Python के साथ शामिल नहीं है), लेकिन सरल समस्याओं के लिए यह शायद सबसे सुविधाजनक है।

+0

वास्तव में, वर्चुअल डी टोर वह था जो मुझे याद नहीं था। – shoosh

+0

एक कंटेनर लौटने वाले फ़ंक्शन को लपेटने के सवाल के बारे में: यह विधि बूस्ट :: पायथन :: सूची लौटने वाली विधियों को उजागर करने के साथ सीधा काम करती है। आईई। बूस्ट :: shared_ptr को सूची में पॉलिमॉर्फिक पायथन तत्वों को जोड़कर। रनटाइम पर सूची तक पहुंचने पर पॉइंटर्स को डिफ्रेंस करना तब वर्णित किया जाएगा जैसा कि वर्णन किया गया है (अगर कहा गया है कि register_ptr_to_python <> परिभाषाएं मौजूद हैं)। – StefanQ

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