Сбой преобразования из std :: vector <double>в список Python (boost python) - PullRequest
0 голосов
/ 25 сентября 2019

Я хочу создать пользовательские преобразования из списка std :: vector в список Python, используя boost python.Для этого я придерживаюсь подхода to_python_converter.Я использовал типичную структуру преобразователя, т.е.

template <class T, bool NoProxy = true>
struct vector_to_list {
  static PyObject* convert(const std::vector<T>& vec) {
    typedef typename std::vector<T>::const_iterator const_iter;
    bp::list* l = new boost::python::list();
    for (const_iter it = vec.begin(); it != vec.end(); ++it) {
      if (NoProxy) {
        l->append(boost::ref(*it));
      } else {
        l->append(*it);
      }
    }
    return l->ptr();
  }
  static PyTypeObject const* get_pytype() { return &PyList_Type; }
};

, которую я могу успешно использовать во многих случаях, но она не работает с std::vector<double>.Вот как я объявляю это преобразование в моем модуле Boost Python следующим образом:

BOOST_PYTHON_MODULE(libmymodule_pywrap) {
  .
  .
  .
  bp::to_python_converter<std::vector<double, std::allocator<double> >,
                          vector_to_list<double, false>, true>(); // this doesn't work
  bp::to_python_converter<std::vector<Eigen::VectorXd,
                          std::allocator<Eigen::VectorXd> >,
                          vector_to_list<Eigen::VectorXd, false>, true>(); // this works well
}

И я получаю следующую ошибку компиляции:

/usr/include/boost/python/object/make_instance.hpp:27:9: error: no matching function for call to ‘assertion_failed(mpl_::failed************ boost::mpl::or_<boost::is_class<double>, boost::is_union<double>, mpl_::bool_<false>, mpl_::bool_<false>, mpl_::bool_<false> >::************)’
         BOOST_MPL_ASSERT((mpl::or_<is_class<T>, is_union<T> >));
         ^
/usr/include/boost/mpl/assert.hpp:83:5: note: candidate: template<bool C> int mpl_::assertion_failed(typename mpl_::assert<C>::type)
 int assertion_failed( typename assert<C>::type );
     ^
/usr/include/boost/mpl/assert.hpp:83:5: note:   template argument deduction/substitution failed:
/usr/include/boost/python/object/make_instance.hpp:27:9: note:   cannot convert ‘mpl_::assert_arg<boost::mpl::or_<boost::is_class<double>, boost::is_union<double>, mpl_::bool_<false>, mpl_::bool_<false>, mpl_::bool_<false> > >(0u, 1)’ (type ‘mpl_::failed************ boost::mpl::or_<boost::is_class<double>, boost::is_union<double>, mpl_::bool_<false>, mpl_::bool_<false>, mpl_::bool_<false> >::************’) to type ‘mpl_::assert<false>::type {aka mpl_::assert<false>}’
         BOOST_MPL_ASSERT((mpl::or_<is_class<T>, is_union<T> >));

Кто-то понимает, что происходит?

...