Al tratar de averiguar el orden óptimo para los parámetros opcionales de una función recientemente, me topé con esta publicación de blog y acompañando el repositorio de GitHub , que proporciona un encabezado para una kwargs
instalación similar a Pythonic en C ++. Aunque no terminé usándolo, me pregunto si esto es bueno o no en un lenguaje fuertemente tipado. Después de haber trabajado en Python durante un tiempo, me parece kwargs
muy atractiva la noción de una instalación similar en mi proyecto porque muchos de sus objetos / funciones tienen una serie de parámetros opcionales (que desafortunadamente no se pueden evitar), produciendo largas listas de constructores que difieren en uno o dos parámetros y podrían hacerse mucho más concisos / DRY-ish.
¿Cuál es, en todo caso, la experiencia de otros con cosas como esta? ¿Debería ser evitado? ¿Hay pautas para ello? ¿Cuáles son los posibles problemas / dificultades?
Respuestas:
No estoy muy familiarizado con los kwargs de C ++, pero me vienen a la mente algunas desventajas después de desnatar su fuente:
Requieren una declaración previa global de todos los argumentos . El ejemplo simple en la publicación del blog tiene esta sección que es peso muerto:
No tan conciso como el original pitónico.
C ++ ofrece alternativas nativas para lograr la funcionalidad de los parámetros con nombre:
Envolturas de estructura . Defina sus parámetros opcionales como campos de una estructura.
Objetos proxy . Los argumentos se almacenan en una estructura temporal que se puede modificar con setters encadenados.
Nota : la plantilla puede resumirse en una macro a expensas de la legibilidad:
Funciones variadas . Obviamente, esto no es seguro para el tipo y requiere el conocimiento de las promociones de tipo para hacerlo bien. Sin embargo, está disponible en C puro si C ++ no es una opción.
Nota : En C ++ esto se puede hacer de tipo seguro con plantillas variadic. La sobrecarga del tiempo de ejecución desaparecerá a expensas de tiempos de compilación más lentos y una hinchazón binaria.
boost :: parámetro . Todavía es una biblioteca de terceros, aunque una biblioteca más establecida que algún repositorio oscuro de Github. Inconvenientes: plantilla pesada.
En una nota de cierre, no usaría esta biblioteca de kwargs simplemente porque hay varias alternativas suficientemente buenas en C ++ para lograr lo mismo. Yo personalmente optaría por 1. o 2. de la lista (no exhaustiva) anterior.
fuente
private
? Hacerlospublic
significa que pueden llamar a la función o establecer la variable directamente.struct foo
es un objeto desechable solo para imitar la sintaxis original de la función Python; pasar valores de nombre en una línea en el sitio de la llamada. Podrían serlo,public
pero ese no era el punto aquí.