2017-11-25 133 views
1

我想用PyBind11来包装一个专门的数组类。但是,该数组有多种可用形式(每个plain-old-datatype一个)。代码如下所示:许多类型的PyBind11模板类

py::class_<Array2D<float>>(m, "Array2Dfloat", py::buffer_protocol(), py::dynamic_attr()) 
    .def(py::init<>()) 
    .def(py::init<Array2D<float>::xy_t,Array2D<float>::xy_t,float>()) 
    .def("size",  &Array2D<float>::size) 
    .def("width",  &Array2D<float>::width) 
    .def("height", &Array2D<float>::height) 
    //... 
    //... 

我想过告诉PyBind11这些类的唯一方法是通过使用一个非常大的宏重复上述每个POD。

有没有更好的方法来做到这一点?

回答

1

你能避免使用宏,用模板声明函数,而不是去:

template<typename T> 
void declare_array(py::module &m, std::string &typestr) { 
    using Class = Array2D<T>; 
    std::string pyclass_name = std::string("Array2D" + typestr; 
    py::class_<Class>(m, pyclass_name.c_str(), py::buffer_protocol(), py::dynamic_attr()) 
    .def(py::init<>()) 
    .def(py::init<Class::xy_t, Class::xy_t, T>()) 
    .def("size",  &Class::size) 
    .def("width",  &Class::width) 
    .def("height", &Class::height) 
} 

然后调用它多次:

declare_array<float>(m, "float"); 
declare_array<int>(m, "int"); 
...