2012-03-27 17 views
7

मेरे पास कई मॉड्यूल हैं जो कन्वर्टर्स को कुछ छोटे प्रकार के लिए परिभाषित करते हैं (जैसे कि std::vector<int> के रूप में इनट्स की सूची); वे स्वतंत्र मॉड्यूल के हिस्से हैं, लेकिन वे कभी कभी दोनों एक स्क्रिप्ट में इस्तेमाल किया जोयह जांच कर रहा है कि कनवर्टर पहले ही पंजीकृत हो चुका है

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

की ओर जाता है मैं कुछ प्रकार पहले से ही परिभाषित करने और दूसरी पंजीकरण को छोड़ जाता है कि कनवर्टर जांच कर सकते हैं कैसे हैं?

उत्तर

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 
} 

ध्यान दें कि आप ((*reg).m_to_python == NULL) के लिए भी जांच करने की जरूरत नहीं तो आप कुछ आर्किटेक्चर में जोखिम,, पंजीकरण कि एक डिफ़ॉल्ट कन्स्ट्रक्टर के रूप में नहीं होता है क्योंकि पंजीकरण को आपके टाइप में एक नल कनवर्टर असाइन करने के लिए कहा जाता है। इस मामले में क्वेरी (जानकारी) खाली पंजीकरण का पता वापस कर देता है।

5

आप शायद रजिस्ट्री क्वेरी कर सकता है, तो कुछ इस तरह (untested) ..

#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

मैंने आपका कोड संपादित किया ताकि यह काम करे। बहुत बहुत धन्यवाद। – eudoxos