2012-05-21 4 views
6

मैं एकमुझे बूस्ट पायथन वेक्टर इंडेक्सिंग सूट में तुलना ऑपरेटरों की आवश्यकता क्यों है?

std::vector<A> 
अजगर को

साथ सी ++ कोड को बेनकाब करना चाहते हैं। मेरा

class A{}; 

तुलनात्मक ऑपरेटर लागू नहीं किया गया है। जब मैं

BOOST_PYTHON_MODULE(libmyvec) 
{ 
    using namespace boost::python; 
    class_<A>("A"); 
    class_<std::vector<A> >("Avec") 
    .def(boost::python::vector_indexing_suite<std::vector<A> >()); 
} 

मुझे तुलना ऑपरेटर के बारे में त्रुटि मिलती है। यदि मैं ए से

class A { 
public: 
    bool operator==(const A& other) {return false;} 
    bool operator!=(const A& other) {return true;} 
}; 

की परिभाषा को बदलता है तो यह एक आकर्षण की तरह काम करता है।

मुझे इन तुलना ऑपरेटर को लागू करने की आवश्यकता क्यों है? क्या उनके बिना vector_indexing_suite का उपयोग करने का कोई तरीका है?

उत्तर

5

vector_indexing_suite__contains__ सदस्य फ़ंक्शन लागू करता है, जिसके लिए समानता ऑपरेटर की उपस्थिति की आवश्यकता होती है। नतीजतन, आपके प्रकार को ऐसे ऑपरेटर प्रदान करना होगा।

Boost.Python का सैंडबॉक्स संस्करण यह निर्धारित करने के लिए गुणों का उपयोग करके इस समस्या को हल करता है कि कंटेनरों पर किस प्रकार के ऑपरेशन उपलब्ध हैं। उदाहरण के लिए, find केवल तभी प्रदान किए जाएंगे जब मान समानता तुलनीय हों।

डिफ़ॉल्ट रूप से, बूस्ट। पायथन सभी मानों को तुलनीय तुलनीय और तुलनात्मक से कम मानते हैं। अपने प्रकार इन आवश्यकताओं को पूरा नहीं करता है के बाद से, आप क्या संचालन इसका समर्थन करता है निर्दिष्ट करने के लिए लक्षण विशेषज्ञ की जरूरत है:

namespace indexing { 
    template<> 
    struct value_traits<A> : public value_traits<int> 
    { 
    static bool const equality_comparable = false; 
    static bool const lessthan_comparable = false; 
    }; 
} 

यह here प्रलेखित है।

+0

आपके उत्तर के लिए धन्यवाद! क्या यह कोड केवल बूस्ट सैंडबॉक्स में उपलब्ध है? इसका उपयोग करने का सबसे आसान तरीका क्या है? [सैंडबॉक्स] (https://svn.boost.org/svn/boost/sandbox/python_indexing_v2/) में फ़ाइलों का आदान-प्रदान करने के बाद मुझे मैन्युअल रूप से बूस्ट को डाउनलोड और संकलित करने की आवश्यकता है? – Hans

+0

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

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