2012-03-27 81 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)否則,你的風險,在某些架構,即登記不會作爲默認構造函數發生,因爲已經將註冊稱爲將一個NULL轉換器分配給YourType。在這種情況下,query(info)確實返回空註冊的地址。

5

你或許可以查詢註冊表,所以像這樣(未經)..

#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 2012-04-03 10:29:53