2012-03-27 4 views
7

J'ai plusieurs modules qui définissent des convertisseurs pour certains types triviaux (tels que la liste des entrées comme std::vector<int>); ce sont des parties de modules indépendants, mais ils sont parfois utilisés à la fois dans un seul script, ce qui conduit àVérifier si un convertisseur a déjà été enregistré

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

Comment puis-je vérifier que convertisseur pour un certain type est déjà définir et sauter la deuxième inscription?

Répondre

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 
} 

Notez que vous devez vérifier aussi pour ((*reg).m_to_python == NULL) sinon vous risquez, dans certaines architectures, que l'enregistrement ne se produit pas en tant que constructeur par défaut car l'enregistrement a été appelé en assignant un convertisseur NULL à YourType. Dans ce cas, query (info) renvoie l'adresse de l'enregistrement vide.

5

Vous pouvez probablement interroger le registre, de sorte que quelque chose comme ça (non testé) ..

#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

J'ai modifié votre code pour que cela fonctionne. Merci beaucoup. – eudoxos

Questions connexes