boost::python: Python list to std::vector
To make your C++ method accept Python lists you should use boost::python::list
void massadd(boost::python::list& ns){ for (int i = 0; i < len(ns); ++i) { add(boost::python::extract<double>(ns[i])); }}
Here's what I use:
#include <boost/python/stl_iterator.hpp>namespace py = boost::python;template< typename T >inlinestd::vector< T > to_std_vector( const py::object& iterable ){ return std::vector< T >( py::stl_input_iterator< T >( iterable ), py::stl_input_iterator< T >( ) );}
Should you find the input type (py::object) too liberal, feel free to specify stricter types (py::list in your case).
Based on the above answers I created an example of accessing python lists in C++ as well as returning a python list from a C++ function:
#include <boost/python.hpp>#include <string>namespace py = boost::python;// dummy classclass drow{ public: std::string word; drow(py::list words); py::list get_chars();};// example of passing python list as argument (to constructor)drow::drow(py::list l){ std::string w; std::string token; for (int i = 0; i < len(l) ; i++){ token = py::extract<std::string>(l[i]); w += token; } this -> word = w;}// example of returning a python listpy::list drow::get_chars(){ py::list char_vec; for (auto c : word){ char_vec.append(c); } return char_vec;}// binding with pythonBOOST_PYTHON_MODULE(drow){ py::class_<drow>("drow", py::init<py::list>()) .def("get_chars", &drow::get_chars);}
For a build example and a test python script take a look here
Thank you Arlaharen & rdesgroppes for the pointers (pun not intended).