2012-05-21 9 views
6

me gustaría exponer código C++ con una¿por qué necesito operadores de comparación en la suite de indexación de vector de boost python?

std::vector<A> 

al pitón. Mi

class A{}; 

no tiene un operador de comparación implementado. Cuando intento

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

Aparece un error acerca de los operadores de comparación. Si cambio la definición de A a

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

Funciona como un amuleto.

¿Por qué tengo que implementar estos operadores de comparación? ¿Hay alguna forma de usar el vector_indexing_suite sin ellos?

Respuesta

5

vector_indexing_suite implementa una función de miembro __contains__, que requiere la presencia de un operador de igualdad. Como consecuencia, su tipo debe proporcionar dicho operador.

La versión de Sandbox de Boost.Python resuelve este problema mediante el uso de características para determinar qué tipo de operaciones están disponibles en los contenedores. Por ejemplo, find solo se proporcionará si los valores son equivalentes a la igualdad.

De forma predeterminada, Boost.Python considera que todos los valores son comparables a la igualdad y no son comparables. Debido a que su tipo no cumple con estos requisitos, es necesario especializar los rasgos para especificar qué operaciones se apoya:

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

Esto está documentado here.

+0

Gracias por su respuesta! ¿Este código solo está disponible en el sandbox boost? ¿Cuál es la forma más fácil de usarlo? ¿Debo descargar y compilar impulso manualmente después de intercambiar los archivos en [sandbox] (https://svn.boost.org/svn/boost/sandbox/python_indexing_v2/)? – Hans

+0

Aparentemente, esta característica aún no está incluida en la versión de lanzamiento de Boost.Python, por lo tanto, si desea usarla, deberá descargar la versión más reciente del entorno limitado y volver a generarla. Sin embargo, no sé cuál es el estado de esta versión (aún no se ha revisado), por lo que es probable que su mejor opción sea seguir con la implementación ficticia de los operadores de comparación. –

Cuestiones relacionadas