Em C ++, o SFINAE e a metaprogramação foram intencionais ou apenas um subproduto de modelos?
11
O SFINAE e a templatemetaprogramação podem fazer coisas maravilhosas e muitas bibliotecas também as usam consideravelmente.
Historicamente, esses dois "conceitos mágicos" foram intencionalmente introduzidos / suportados em C ++? Ou eles foram descobertos mais tarde como subprodutos úteis (produtos secundários) da templateprogramação original ?
Cerca de uma década atrás, depois de um dia de conferência, encontrei-me em um pub com Erwin Unruh e alguns outros e perguntei-lhe sobre o programa mencionado por VJovic . Já tomamos algumas cervejas até então, foi uma reunião não oficial, e ela vive na minha cabeça há uma década, então leve isso com um pouco de sal, mas de acordo com minhas lembranças:
Ele disse que eles adicionaram recursos de modelo para servir melhor o STL. Segundo ele, alguns / muitos no comitê sentiram que estavam criando algo sem conhecer todas as suas capacidades. Ele próprio suspeitava que todo o material do modelo, especialmente a especialização parcial, criava uma linguagem completa de Turing, e ele sempre quis fazer uma prova formal disso, mas nunca se deu bem com isso.
Em vez disso, uma noite em uma reunião de padronização, ele apresentou o programa que imprimia números primos como mensagens de erro (uma versão que deve funcionar com os compiladores modernos está aqui ) que ele computou durante a compilação. Como um metaprograma de modelo, ele não é muito impressionante pelos padrões de hoje, mas foi o primeiro, afinal. Alguém fez o que ele considerou uma piada enviando formalmente o programa para que ele se tornasse um documento oficial de padronização da ISO.
Lembro que lhe perguntei especificamente sobre a reação de Bjarne Stroustrup ao programa e, em resposta, Erwin o imitou, cobrindo os olhos com a mão. :)
Em retrospectiva, lamento não ter perguntado a Todd Veldhuizen , que também estava naquela conferência, como ele criou modelos de expressão . (Ele certamente era um bom sujeito para conversar.) Mas eu era muito mais jovem e deixei passar a oportunidade da vida.:(
+1, experiência interessante. Eles falaram alguma coisa sobre SFINAE então?
iammilind
@iammilind: Eu acho que SFINAE é apenas um dos recursos que ele mencionou que foram adicionados para melhor apoiar o STL, embora o apelido "SFINAE" tenha sido cunhado anos depois disso.
SBI
11
Em 1994, durante uma reunião do comitê de padronização do c ++, E. Unruh descobriu que os modelos podem ser usados para calcular algo em tempo de compilação. Ele escreveu um programa que imprime números primos. A parte intrigante deste exercício foi que a produção dos números primos foi realizada pelo compilador durante o processo de compilação e não no tempo de execução. Embora esse programa não fosse totalmente portátil, o programa mostrou que o mecanismo de instanciação de modelo é uma linguagem recursiva primitiva que pode executar cálculos não triviais em tempo de compilação.
Este trecho é retirado de "c ++ templates" de Vandevoorde e Josuttis (capítulo 17).
Como você pode ver, foi descoberto cedo e seu poder foi reconhecido imediatamente.
@iammilind Editou a resposta. Eu diria que foi acidentalmente, porque o suporte aos compiladores para modelos era limitado. O programa não era portátil e acho que funcionou apenas em um compilador
Este trecho é retirado de "c ++ templates" de Vandevoorde e Josuttis (capítulo 17).
Como você pode ver, foi descoberto cedo e seu poder foi reconhecido imediatamente.
fonte