2012-03-27 8 views
7

Mam kilka modułów, które definiują konwertery dla niektórych trywialnych typów (takich jak lista int jako std::vector<int>); oni są częściami niezależnych modułów, ale są czasami stosowane zarówno w jednym skrypcie, który prowadzi doSprawdzanie, czy konwerter został już zarejestrowany

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

Jak mogę sprawdzić, czy jakiegoś konwertera typu jest już zdefiniowania i pominąć drugą rejestrację?

Odpowiedz

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 
} 

Należy pamiętać, że trzeba sprawdzić również dla ((*reg).m_to_python == NULL) przeciwnym razie istnieje ryzyko, w niektórych architekturach, że rejestracja nie występuje jako domyślny konstruktor, ponieważ rejestracja została nazwana przypisaniem konwertera NULL do YourType. W tym przypadku zapytanie (informacja) zwraca adres pustej rejestracji.

5

Prawdopodobnie można kwerendy rejestru, więc coś takiego (niesprawdzone) ..

#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

Edytowałem twój kod, aby działał. Wielkie dzięki. – eudoxos

Powiązane problemy