¿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?
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 deMyClass
con un valor de parámetro de plantilla de 10, puedes definir la clase en Python de la siguiente manera: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íneapy::init<int>()
define un constructor que toma un argumento entero, que es el valor del parámetro de plantilla. La líneapy::arg("n")=10
establece un valor predeterminado de 10 para el argumenton
, que es el parámetro de plantilla. Por último, la líneadef("show_n", &MyClass<>::show_n)
expone el métodoshow_n
a Python.Para crear una instancia de
MyClass
con un valor de parámetro de plantilla de 15, puedes llamar a la funcióncreate_myclass
en Python de la siguiente manera:Esto creará una instancia de
MyClass
con un valor de parámetro de plantilla de 15, y el métodoshow_n
imprimirá 15 cuando se llame.</myclass<></myclass<>