2012-03-27 8 views
7

Tôi có một số mô-đun xác định trình biến đổi cho một số loại tầm thường (chẳng hạn như danh sách các số int như std::vector<int>); họ là một phần của mô-đun độc lập, nhưng họ là đôi khi cả hai được sử dụng trong một kịch bản, dẫn đếnKiểm tra xem bộ chuyển đổi đã được đăng ký chưa

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

Làm thế nào tôi có thể kiểm tra xem chuyển đổi đối với một số loại đã được xác định và bỏ qua việc đăng ký thứ hai?

Trả lời

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 
} 

Lưu ý rằng bạn cần phải kiểm tra cũng cho ((*reg).m_to_python == NULL) nếu không bạn có nguy cơ, trong một số kiến ​​trúc, mà việc đăng ký không xảy ra như một hàm tạo mặc định vì đăng ký đã được gọi là gán một bộ chuyển đổi NULL cho YourType. Trong trường hợp này truy vấn (thông tin) không trả lại địa chỉ của đăng ký trống.

5

Bạn có thể truy vấn registry, do đó một cái gì đó như thế này (chưa được kiểm tra) ..

#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

Tôi đã chỉnh sửa mã của bạn để mã hoạt động. Cảm ơn rất nhiều. – eudoxos