2012-05-21 18 views
6

chciałbym narazić kodu C++ zDlaczego potrzebuję operatorów porównania w pakiecie wektorów doładowania Pythona?

std::vector<A> 

do pytona. Moje

class A{}; 

nie ma wdrożonego operatora porównania. Gdy próbuję uzyskać

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> >()); 
} 
pojawia się błąd dotyczący operatorów porównania. Jeśli zmienię definicję A na

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

Działa jak urok.

Dlaczego muszę wdrożyć operatorów porównania? Czy istnieje sposób bez nich używać vector_indexing_suite?

Odpowiedz

5

vector_indexing_suite implementuje funkcję składową __contains__, która wymaga obecności operatora równości. W konsekwencji twój typ musi zapewnić takiego operatora.

Wersja Boost.Pythona w wersji Sandbox rozwiązuje ten problem za pomocą funkcji określających, jakie operacje są dostępne w kontenerach. Na przykład: find zostanie dostarczony tylko wtedy, gdy wartości będą porównywalne pod względem równości.

Domyślnie Boost.Python uważa, że ​​wszystkie wartości są porównywalne i mniej niż porównywalne. Ponieważ Twój typ nie spełnia tych wymagań, trzeba się specjalizować cechy, aby określić, jakie operacje obsługuje:

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

Jest to udokumentowane here.

+0

Dzięki za odpowiedź! Czy ten kod jest dostępny tylko w obszarze zwiększającym wydajność? Jak najprościej z niego skorzystać? Czy muszę ręcznie pobierać i kompilować doładowania po wymianie plików w [piaskownicy] (https://svn.boost.org/svn/boost/sandbox/python_indexing_v2/)? – Hans

+0

Wygląda na to, że ta funkcja nie jest jeszcze dostępna w wersji Release Boost.Python, więc jeśli chcesz z niej korzystać, musisz pobrać najnowszą wersję ze środowiska sandbox i odbudować ją. Nie wiem jednak, jaki jest status tej wersji (nie jest jeszcze sprawdzany), więc najlepiej jest pozostać przy fikcyjnej implementacji operatorów porównania. –

Powiązane problemy