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 ?

Respostas:


19

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.


2
Um bom. Este tipo de artigo que eu também li na internet, não me lembro da fonte. Isso também é verdade para a SFINAE?
iammilind

@iammilind O que você quer dizer com "Isso também é verdade para a SFINAE?"
BЈовић

11
O SFINAE geralmente precisa de algum suporte do compilador. Portanto, é possível que não tenha sido descoberto acidentalmente.
Izmilind

@iammilind eu encontrei o artigo de um InformIT que tem um texto similar do livro: informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић

@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
#
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.