En C ++, ¿SFINAE y la metaprogramación fueron intencionales o simplemente un subproducto de plantillas?


11

SFINAE y la templatemetaprogramación pueden hacer cosas maravillosas y muchas bibliotecas también las usan considerablemente.

¿Históricamente estos dos "conceptos mágicos" fueron introducidos / soportados intencionalmente en C ++? ¿O simplemente se descubrieron más tarde como subproductos útiles (productos secundarios) de la templateprogramación original ?

Respuestas:


19

Hace aproximadamente una década, después de un día de conferencia, me encontré en un pub con Erwin Unruh y algunos otros, y le pregunté sobre el programa que mencionó VJovic . Hemos tenido un par de cervezas para entonces, fue una reunión no oficial, y se vivió en mi cabeza durante una década, así que tómalo con un grano de sal, pero según mis recuerdos:

Dijo que habían agregado características de plantilla para servir mejor al STL. Según él, algunos / muchos en el comité sintieron que estaban creando algo sin conocer todas sus capacidades. Él mismo sospechaba que todo el material de la plantilla, especialmente la especialización parcial, formaba un lenguaje completo de Turing, y siempre quiso hacer una prueba formal de eso, pero nunca lo hizo.

En cambio, una noche en una reunión de estandarización se le ocurrió ese programa que imprimía números primos como mensajes de error (una versión que debería funcionar con los compiladores modernos está aquí ) que calculó durante la compilación. Como metaprograma de plantilla, no es muy impresionante para los estándares actuales, pero fue el primero, después de todo. Alguien hizo lo que él consideraba una broma al presentar formalmente el programa para que se convirtiera en un documento oficial de estandarización ISO.

Recuerdo que le pregunté específicamente sobre la reacción de Bjarne Stroustrup al programa, y ​​en respuesta Erwin lo imitó cubriéndose los ojos con la mano. :)

En retrospectiva, lamento no haberle preguntado a Todd Veldhuizen , quien también estuvo en esa conferencia, cómo se le ocurrieron las plantillas de expresión . (Ciertamente era un buen tipo con el que hablar). Pero yo era mucho más joven y dejé pasar la oportunidad de toda la vida.:(


+1, experiencia interesante. ¿Hablaron algo sobre SFINAE entonces?
iammilind

@iammilind: Creo que SFINAE es solo una de las características que mencionó que se agregaron para respaldar mejor el STL, aunque el apodo de "SFINAE" solo se acuñó años después de eso.
sbi

11

En 1994, durante una reunión del comité de estandarización de c ++, E. Unruh descubrió que las plantillas se pueden usar para calcular algo en tiempo de compilación. Escribió un programa que imprime números primos. La parte intrigante de este ejercicio fue que el compilador realizó la producción de los números primos durante el proceso de compilación y no en el tiempo de ejecución. Aunque este programa no era completamente portátil, el programa mostró que el mecanismo de creación de instancias de plantilla es un lenguaje recursivo primitivo que puede realizar cálculos no triviales en tiempo de compilación.

Vandevoorde y Josuttis (capítulo 17) toman este extracto de las "plantillas de c ++".

Como puede ver, se descubrió temprano y su poder se reconoció de inmediato.


2
Bueno uno Este tipo de artículo que he leído en Internet también, no recuerdo la fuente. ¿Es esto cierto también para SFINAE?
iammilind

@iammilind ¿Qué quieres decir con "¿Esto también es cierto para SFINAE?"
Bћовић

1
SFINAE generalmente necesita algún apoyo del compilador. Por lo tanto, es posible que no se haya descubierto accidentalmente.
iammilind

@iammilind Encontré un artículo de información que tiene un texto similar del libro: informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић

@iammilind Editó la respuesta. Diría que fue accidental, porque el soporte de los compiladores para plantillas era limitado. El programa no era portátil, y creo que funcionó solo en un compilador
antes del
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.