I have a C++ library where const references to OpenCV types are returned. Now I'm porting the interface to Python and have hit upon what looks to be an old issue; there doesn't appear to be a way to have boost.python intrinsically convert a const reference OpenCV type to a Python object (tuple or numpy). My guess is that I'm missing something, but maybe not. So I'm providing more details
Right now I'm writing wrapper classes/functions to handle the interface but would prefer to define a conversion of the types in a way that boost.python can just do the conversion without individual class/function wrappers explicitly declared for everything. For example, if a method returns a member variable of type cv::Vec3d as 'const cv::Vec3d&', I would like to declare one "const cv:Vec3d& to Python" converter and have that be used/specified where needed; and another for Python to const cv:Vec3d&. Sans individual wrapper classes/functions. Going over the library I've come closest with one of: 1) declare things in such a way as to get a [paraphrasing] "unable to convert pointer to const cv::Vec3d&() type" error [in as_to_python_function.hpp - so close!], or 2) use return_value_policy<copy_const_ref> which Python subsequently can't convert. I think declaring something along the lines of "class_<cv::Vec3d>..." might work but then I'm redefining the OpenCV class which I don't like to do since my library shouldn't make OpenCV types visible in Python. I am new to boost.python so I'm probably wrong, but it appears the best solution would be to have as_to_python_function.cpp split into reference and copy-constructor classes to handle the appropriate differences. Right now the same class handles both cases. Any help is appreciated. I am including a simple example: #include <boost/python.hpp> namespace p = boost::python; class Vec3d { public: Vec3d() {v[0] = v[1] = v[2] = 0.0;} virtual ~Vec3d() {} private: double v[3]; }; class UseVec3d { public: UseVec3d() {} UseVec3d(const Vec3d& vec) : v(vec) {} virtual ~UseVec3d() {}; const Vec3d& get_vec() const {return v;} void set_vec(const Vec3d& vec) {v = vec;} private: Vec3d v; }; BOOST_PYTHON_MODULE(test) { p::class_<UseVec3d>("UseVec3d") .def("get_vec", &UseVec3d::get_vec) // Error's here ; }
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org https://mail.python.org/mailman/listinfo/cplusplus-sig