2012-03-27 8 views
7

Tengo varios módulos que definen convertidores para algunos tipos triviales (como la lista de ints como std::vector<int>); que son partes de módulos independientes, pero a veces son ambos usados ​​en una secuencia de comandos, lo que conduce aComprobación de si un convertidor ya se ha registrado

RuntimeWarning: to-Python converter for std::vector<int, std::allocator<int> > already registered; second conversion method ignored. 

¿Cómo puedo comprobar que el convertidor de algún tipo ya está definir y omitir el segundo registro?

Respuesta

6
boost::python::type_info info = boost::python::type_id<YourType>(); 
const boost::python::converter::registration* reg = boost::python::converter::registry::query(info); 
if (reg == NULL) { 
    //register YourType 
} else if ((*reg).m_to_python == NULL) { 
    //register YourType 
} 

Tenga en cuenta que es necesario comprobar también para ((*reg).m_to_python == NULL) contrario corre el riesgo, en algunas arquitecturas, que el registro no ocurre como un constructor predeterminado porque el registro se ha llamado asignar un convertidor NULL a YourType. En este caso, la consulta (información) devuelve la dirección del registro vacío.

5

probablemente Puede consultar el registro, por lo que algo como esto (no probado) ..

#include <boost/python/converter/registry.hpp> 

boost::python::type_info info = boost::python::type_id<YourType>(); 
boost::python::converter::registration* reg = boost::python::converter::registry::query(info); 
if (reg == NULL) 
{ 
    //registry YourType 
} 
+0

He editado su código para que funcione. Muchas gracias. – eudoxos

Cuestiones relacionadas