es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Es posible envolver una clase con plantilla usando pybind11?

Solo una clase simple como ejemplo:

template <int n>
class MyClass
{
public:
    void show_n(); // imprime n
};

Ahora quiero envolver esto para exponerlo como una clase de Python:

PYBIND11_MODULE(MyModule, handle) {
    py::class_<MyClass<5>>(handle)
    .def("show_n", &MyClass<5>::show_n);
}

Ahora quiero que el parámetro de la plantilla se defina en Python. ¿Cómo puedo pasarlo desde Python? ¿Es posible?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible pasar el parámetro de plantilla desde Python. Pybind11 permite la instanciación de plantillas en tiempo de ejecución utilizando la plantilla py::class_.

    Para pasar el parámetro de plantilla desde Python, puedes utilizar la función pybind11::arg para definir un valor predeterminado para el parámetro de plantilla. Por ejemplo, si deseas crear una instancia de MyClass con un valor de parámetro de plantilla de 10, puedes definir la clase en Python de la siguiente manera:

    m.def("create_myclass", []() {
        return py::class_<myclass<>, std::unique_ptr<myclass<>>>(m, "MyClass")
            .def(py::init<int>(), py::arg("n")=10)
            .def("show_n", &MyClass<>::show_n);
    });
    

    En este ejemplo, la plantilla py::class_ se instancia con una lista de parámetros de plantilla vacía, lo que significa que el parámetro de plantilla puede pasarse en tiempo de ejecución. La línea py::init<int>() define un constructor que toma un argumento entero, que es el valor del parámetro de plantilla. La línea py::arg("n")=10 establece un valor predeterminado de 10 para el argumento n, que es el parámetro de plantilla. Por último, la línea def("show_n", &MyClass<>::show_n) expone el método show_n a Python.

    Para crear una instancia de MyClass con un valor de parámetro de plantilla de 15, puedes llamar a la función create_myclass en Python de la siguiente manera:

    myobj = create_myclass(15) # crea una instancia de MyClass<15>
    myobj.show_n() # imprime 15
    

    Esto creará una instancia de MyClass con un valor de parámetro de plantilla de 15, y el método show_n imprimirá 15 cuando se llame.</myclass<></myclass<>

Comments are closed.