2017-11-25 13 views
1

PyBind11을 사용하여 특수한 배열 클래스를 래핑하려고합니다. 그러나이 배열은 다양한 형태로 제공됩니다 (각 일반 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"); 
...