diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp index dfaef06f1b45a4fe0b407f34039fd3ea62203ebf..2d77adef9df360baaa78fa4ea1f582fd78df4e0e 100644 --- a/include/eigenpy/details.hpp +++ b/include/eigenpy/details.hpp @@ -183,13 +183,6 @@ namespace eigenpy template<typename MatType> struct EigenFromPy { - EigenFromPy() - { - bp::converter::registry::push_back - (reinterpret_cast<void *(*)(_object *)>(&convertible), - &construct,bp::type_id<MatType>()); - } - // Determine if obj_ptr can be converted in a Eigenvec static void* convertible(PyArrayObject* obj_ptr) { @@ -330,6 +323,34 @@ namespace eigenpy enableEigenPySpecific<MatType>(); } + template<typename MatType> + struct EigenFromPyConverter + { + static void registration() + { + bp::converter::registry::push_back + (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible), + &EigenFromPy<MatType>::construct,bp::type_id<MatType>()); + + // Add also conversion to Eigen::MatrixBase<MatType> + bp::converter::registry::push_back + (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible), + &EigenFromPy<MatType>::construct,bp::type_id< Eigen::MatrixBase<MatType> >()); + } + }; + + template<typename MatType> + struct EigenFromPyConverter< eigenpy::Ref<MatType> > + { + static void registration() + { + bp::converter::registry::push_back + (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible), + &EigenFromPy<MatType>::construct,bp::type_id<MatType>()); + } + }; + + template<typename MatType> void enableEigenPySpecific() { @@ -337,7 +358,8 @@ namespace eigenpy if(check_registration<MatType>()) return; bp::to_python_converter<MatType,EigenToPy<MatType> >(); - EigenFromPy<MatType>(); + EigenFromPyConverter<MatType>::registration(); + } } // namespace eigenpy