2012-03-27 36 views
7

Ich habe mehrere Module, die Konverter für einige triviale Typen definieren (z. B. Liste von Ints wie std::vector<int>); sie sind Teile von unabhängigen Modulen, aber sie sind manchmal auch beides in einem Skript verwendet, die Überprüfen, ob ein Konverter bereits registriert wurde

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

zu

führt Wie kann ich diesen Konverter für irgendeine Art überprüfen ist bereits definiert und die zweite Registrierung überspringen? , Dass die Registrierung

Antwort

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 
} 

Beachten Sie, dass Sie auch für ((*reg).m_to_python == NULL) sonst riskieren Sie, in einigen Architekturen überprüfen müssen tritt nicht als Standardkonstruktor auf, weil die Registrierung aufgerufen wurde, indem Sie einen YourType-NULL-Konverter zugewiesen haben. In diesem Fall gibt die Abfrage (info) die Adresse der leeren Registrierung zurück.

5

Sie können sich wahrscheinlich die Registrierung, so etwas wie dieses (nicht getestet) abfragen ..

#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

Ich habe Ihren Code so bearbeitet, dass er funktioniert. Danke vielmals. – eudoxos

Verwandte Themen