Search code examples
pythonc++syntaxpybind11

What is the proper syntax to bind a typedef type using pybind11?


I have a struct very similar to this:

struct data_point
{
    data_point() = delete;
    data_point(const int& data) :
            m_data(data)
    {}

    int m_data;
};

I also have this type declared as such.

typedef std::vector<data_point> data_list;

The binding for this struct is defined:

PYBIND11_MODULE(data_lib, ref)
{
    py::class_<data_point> dp(ref, "data_point");
    dp.def(py::init<const int&>());
    dp.def_readwrite("m_data", &data_point::m_data);
}

How do I define a binding for the typedef list type? Its not clear to me how to do this in the pybind documentation.


Solution

  • For this specific issue, pybind will automatically interpret an std::vector type as a python list when you include "pybind11/stl.h" . Thus, a binding for this type is unnecessary.

    Ex:

    #include "pybind11.h"
    #include "pybind11/stl.h"
    
    struct data_point
    {
        data_point() = delete;
        data_point(const int& data) :
                m_data(data)
        {}
        int m_data;
    };
    
    std::vector<data_point> make_vec(){
        return {data_point(20), data_point(18)};
    }
    
    PYBIND11_MODULE(data_lib, ref)
    {
        py::class_<data_point> dp(ref, "data_point");
        dp.def(py::init<const int&>());
        dp.def_readwrite("m_data", &data_point::m_data);
    
        ref.def("make_vec", &make_vec, "A function that returns a vector of data_points");
    }
    

    In python, when you import the data_lib library you will be able to use functions that return lists of data_point.

    import data_lib
    p = data_lib.make_vec()
    print len(p)
    

    output: 2