2012-05-21 18 views
6

Tôi muốn hiển thị mã C++ bằng một số:tại sao tôi cần các toán tử so sánh trong bộ lập chỉ mục vector python tăng?

std::vector<A> 

tới python. My

class A{}; 

không có toán tử so sánh được triển khai. Khi tôi thử

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

Tôi gặp lỗi về toán tử so sánh. Nếu tôi thay đổi định nghĩa của A thành

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

Nó hoạt động như một sự quyến rũ.

Tại sao tôi cần triển khai các toán tử so sánh này? Có cách nào để sử dụng vector_indexing_suite mà không có chúng?

Trả lời

5

vector_indexing_suite triển khai hàm __contains__, yêu cầu sự hiện diện của toán tử bình đẳng. Kết quả là, loại của bạn phải cung cấp một toán tử như vậy.

Phiên bản hộp cát của Boost.Python giải quyết vấn đề này bằng cách sử dụng các đặc điểm để xác định loại hoạt động nào có sẵn trên vùng chứa. Ví dụ: find sẽ chỉ được cung cấp nếu các giá trị là tương đương bình đẳng.

Theo mặc định, Boost.Python xem xét tất cả các giá trị để được so sánh bình đẳng và ít hơn so sánh. Kể từ loại của bạn không đáp ứng được các yêu cầu này, bạn cần phải chuyên các đặc điểm để xác định những gì hoạt động nó hỗ trợ:

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

Đây là tài liệu here.

+0

Cảm ơn câu trả lời của bạn! Mã này chỉ có sẵn trong hộp cát tăng không? Cách dễ nhất để sử dụng nó là gì? Tôi có cần tải xuống và biên dịch boost bằng tay sau khi trao đổi các tập tin trong [sandbox] (https://svn.boost.org/svn/boost/sandbox/python_indexing_v2/) không? – Hans

+0

Rõ ràng, tính năng này không được bao gồm trong phiên bản phát hành của Boost.Python, vì vậy nếu bạn muốn sử dụng nó, bạn sẽ phải tải xuống phiên bản mới nhất từ ​​sandbox và xây dựng lại nó. Tuy nhiên, tôi không biết tình trạng của phiên bản này là gì (nó chưa được xem xét), vì vậy, đặt cược tốt nhất của bạn có lẽ là gắn bó với việc thực hiện giả của các toán tử so sánh. –

Các vấn đề liên quan