2012-05-21 10 views
6

Vorrei esporre il codice C++ con unperché ho bisogno di operatori di confronto nella suite di indicizzazione vettoriale boost python?

std::vector<A> 

al pitone. My

class A{}; 

non ha un operatore di confronto implementato. Quando provo

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

Viene visualizzato un errore sugli operatori di confronto. Se cambio la definizione di A a

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

Funziona come un fascino.

Perché è necessario implementare questi operatori di confronto? C'è un modo per utilizzare il vector_indexing_suite senza di loro?

risposta

5

vector_indexing_suite implementa una funzione membro __contains__, che richiede la presenza di un operatore di uguaglianza. Di conseguenza, il tuo tipo deve fornire un tale operatore.

La versione sandbox di Boost.Python risolve questo problema utilizzando i tratti per determinare il tipo di operazioni disponibili sui contenitori. Ad esempio, find verrà fornito solo se i valori sono uguali.

Per impostazione predefinita, Boost.Python considera tutti i valori uguali e confrontabili. Dal momento che il tipo non soddisfa questi requisiti, è necessario specializzarsi i tratti di specificare quali operazioni supporta:

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

Questo è documentato here.

+0

Grazie per la risposta! Questo codice è disponibile solo nella sandbox boost? Qual è il modo più semplice per usarlo? Devo scaricare e compilare manualmente boost dopo aver scambiato i file nella [sandbox] (https://svn.boost.org/svn/boost/sandbox/python_indexing_v2/)? – Hans

+0

Apparentemente, questa funzione non è ancora inclusa nella versione di Boost.Python, quindi se vuoi usarla, devi scaricare l'ultima versione dalla sandbox e ricostruirla. Tuttavia, non so quale sia lo stato di questa versione (non è ancora stata esaminata), quindi la soluzione migliore è probabilmente quella di attuare l'implementazione fittizia degli operatori di confronto. –

Problemi correlati