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 kwargsinstalació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 kwargsmuy 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? Hacerlospublicsignifica que pueden llamar a la función o establecer la variable directamente.struct fooes 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,publicpero ese no era el punto aquí.