Como muchos de ustedes saben, los conceptos , el enfoque de C ++ para restringir los tipos posibles para un argumento de plantilla no se pudo incluir en C ++ 11.
Aprendí que el lenguaje de programación D 2.0 tiene una característica similar para su programación genérica. Su solución me parece bastante elegante y simple.
Entonces mi pregunta es por qué C ++ no puede usar un enfoque similar .
- ¿El objetivo del concepto C ++ podría ser mayor que el que proporciona la implementación de D?
- ¿O el legado de C ++ le impide adoptar este enfoque?
- ¿O cualquier otro?
Gracias por tus respuestas.
ps Para ver algunos ejemplos del poder de programación genérico de D, consulte esto: /programming/7300298/metaprogramming-in-c-and-in-d/7303534#7303534
Respuestas:
El estándar de C ++ es un documento normativo, que establece reglas que permanecerán (en su mayoría no afectadas) en los documentos futuros. Por lo tanto, el comité ha adoptado un enfoque muy cauteloso con respecto a sus actualizaciones.
Las adiciones a la biblioteca estándar fueron algo fáciles. Varias bibliotecas habían estado en Boost durante mucho tiempo: se había demostrado que funcionaban.
Sin embargo, las adiciones a los conceptos centrales en el lenguaje son mucho más difíciles de experimentar, ya que primero requiere modificar un compilador. Se había especificado una característica de C ++ 03 (la exportación de plantillas) sin el soporte del compilador ... el resultado fue horrible. Los implementadores de la interfaz del compilador EDG lo informaron como una tarea masiva (varios años hombre) con muy poca ganancia. Ningún otro compilador ha intentado implementarlo. No es una situación cómoda.
Características como
constexpr
ostatic_assert
eran fáciles (y ya emuladas por bibliotecas). Las lambdas se entienden bastante bien y se implementan en una variedad de otros idiomas, ya se ha realizado una investigación exhaustiva, por lo que fue principalmente una cuestión de sintaxis.Por otro lado, los conceptos se consideraron demasiado nuevos y no se probaron . Apenas se especificaron a tiempo, no hubo prueba de concepto ... y, por lo tanto, fueron rechazados, en lugar de esperarlos (o cometer un error).
¿Por qué no seguir a D? No se dice que no lo hará. El comité ha alentado a las personas a repensar desde cero, sin límite de tiempo, e intentar incluirlos en un compilador para ver cómo interactúan con otras características del lenguaje. Cabe destacar la cuestión de separar los conceptos y los mapas conceptuales: ¿deberían agruparse como uno o no?
FYI: Actualmente hay una rama de Clang dedicada a esta experimentación, dirigida por Larisse Voufo de la universidad de Indiana.
fuente
Para el estándar de 2011, los conceptos de C ++ eran en lo que se estaba trabajando, y finalmente se eliminaron de ese estándar, porque no estaban "suficientemente cocidos". El trabajo continúa en conceptos de C ++ que pueden llevarlos a pasar al siguiente estándar. Sin embargo, podría ser que algunas personas trabajen en una propuesta para el próximo estándar que sea similar a las restricciones de plantilla de D. Queda por ver si eso sucede o no. Hasta donde sé, no existía tal propuesta para el estándar de 2011, por lo que no había posibilidad de que se convirtiera en ese estándar independientemente de sus méritos, pero lo que lo hará o no en el próximo estándar es completamente desconocido. en este punto.
No conozco ninguna razón importante por la que algo similar a las restricciones de plantilla de D no se pueda implementar para C ++, aunque dado que C ++ generalmente es más limitado en lo que puede hacer en tiempo de compilación, podría ser más difícil hacer que funcionen como bien como lo hacen en D (aunque la introducción de cosas como
constexpr
ciertamente ayuda).Entonces, realmente, creo que la respuesta corta es que no hay una razón técnica por la cual algo similar a las restricciones de plantilla de D no pueda estar en C ++.
La pregunta es si dicha propuesta se hará para el próximo estándar y cómo se comparará con cualquier propuesta similar que se haga (por ejemplo, propuestas relacionadas con conceptos). Suponiendo que se pueda hacer una propuesta aceptable, esperaría completamente que algo similar a los conceptos o las restricciones de la plantilla de D lo conviertan en el próximo estándar simplemente porque hay un gran deseo de hacerlo. La pregunta es si alguien puede presentar una propuesta que sea lo suficientemente sólida y "lo suficientemente elaborada" para ser aceptable.
fuente
¿Te refieres a las restricciones de plantilla de D?
Hasta donde sé, los conceptos de C ++ se habían propuesto en nombre de boost :: concept. El problema, aquí, es que boost es una biblioteca escrita para C ++ 03. C ++ 11 tiene otras capacidades de sintaxis que permiten implementar ciertas cosas de una manera diferente que C ++ 03 permite (por lo tanto, el refuerzo en sí mismo puede reescribirse aprovechando la nueva sintaxis).
El comité estándar abandonó los conceptos porque habría tardado demasiado en especificarlos (lo que retrasará nuevamente la aprobación de c ++ 11). Probablemente irán en la próxima versión de C ++.
Mientras tanto, la sintaxis de D es diferente de C ++ y D conserva algunas capacidades de evaluación de expresión en tiempo de compilación que C ++ no siempre puede tener sin romper algún código heredado (algo que D no tiene, ya que tiene un historial más corto). C ++ ahora tiene
static_assert
ycostexpr
, eso permite mejorar las capacidades de evaluación de tiempo de compilación. Puede ser en el futuro alcanzará un nivel similar.fuente
Aquí hay un control de calidad con Herb Sutter, habla sobre conceptos en la marca de 15 minutos.
http://channel9.msdn.com/Shows/Going+Deep/Herb-Sutter-C-Questions-and-Answers
Si te gusta, aquí hay otro: http://channel9.msdn.com/Shows/Going+Deep/Conversation-with-Herb-Sutter-Perspectives-on-Modern-C0x11
Ahora en cuanto a tu pregunta. ¿Por qué no la versión D? Bueno, ¿por qué usarlo? C ++ es un lenguaje muy complejo y estable. Cada característica debe seleccionarse con mucho cuidado, ya que generalmente debe ser compatible durante décadas. Si observa el primer estándar de C ++ y sigue las revisiones, hay algunas características obsoletas, pero incluso esas deben ser compatibles. Por lo tanto, tiene sentido diseñar conceptos que se ajusten al 100% a C ++.
En cuanto a por qué no se incluyó en C ++ 0x. Bueno porque era enorme. La propuesta tenía 100 páginas y era muy difícil de implementar. Se decidió que esta característica necesita más tiempo para madurar hasta que se incluya en el estándar.
fuente
En pocas palabras, C ++ tiene mucho más bagaje histórico que D. Sería mucho más fácil implementar un montón de cosas si no fuera por el hecho de que C ++ tiene enormes cantidades de código histórico que deben continuar funcionando correctamente. y como se esperaba D no tiene este problema.
fuente