En C ++, SFINAE et la métaprogrammation étaient-ils intentionnels ou juste un sous-produit de modèles?


11

SFINAE et la templatemétaprogrammation peuvent faire des choses merveilleuses et de nombreuses bibliothèques les utilisent également considérablement.

Historiquement, ces deux "concepts magiques" ont été intentionnellement introduits / pris en charge en C ++? Ou ont-ils été découverts plus tard comme des sous-produits utiles (produits secondaires) de la templateprogrammation originale ?

Réponses:


19

Il y a environ dix ans, après une journée de conférence, je me suis retrouvé dans un pub avec Erwin Unruh et quelques autres et je lui ai posé des questions sur le programme mentionné par VJovic . Nous avons déjà eu quelques bières à ce moment-là, c'était une réunion officieuse, et cela a vécu dans ma tête pendant une décennie, alors prenez cela avec un grain de sel, mais selon mes souvenirs:

Il a dit qu'ils avaient ajouté des fonctionnalités de modèle afin de mieux servir la STL. Selon lui, certains / plusieurs membres du comité ont estimé qu'ils créaient quelque chose sans en connaître toutes les capacités. Il soupçonnait lui-même que tous les trucs de modèles, en particulier la spécialisation si partielle, constituaient un langage complet de Turing, et il avait toujours voulu en faire une preuve formelle, mais il ne s'en est jamais sorti.

Au lieu d'une nuit, lors d'une réunion de normalisation, il a proposé ce programme qui imprimait les nombres premiers sous forme de messages d'erreur (une version qui devrait fonctionner avec les compilateurs modernes est ici ) qu'il a calculé pendant la compilation. En tant que méta-programme modèle, il n'est pas très impressionnant par rapport aux normes d'aujourd'hui, mais c'était une première, après tout. Quelqu'un a fait ce qu'il considérait comme une plaisanterie en soumettant officiellement le programme afin qu'il devienne un document officiel de normalisation ISO.

Je me souviens que je lui ai spécifiquement posé des questions sur la réaction de Bjarne Stroustrup au programme, et en réponse Erwin l'a imité en se couvrant les yeux avec sa main. :)

Avec le recul, je regrette de n'avoir pas demandé à Todd Veldhuizen , qui était également présent à cette conférence, comment il avait trouvé des modèles d'expression . (Il était certainement un bon gars à qui parler.) Mais j'étais beaucoup plus jeune que, et j'ai laissé passer l'opportunité de toute une vie.:(


+1, expérience intéressante. Ont-ils alors parlé de SFINAE?
iammilind

@iammilind: Je pense que SFINAE n'est qu'une des fonctionnalités qu'il a mentionnées qui ont été ajoutées pour mieux prendre en charge la STL, bien que le surnom de "SFINAE" n'ait été inventé que des années après.
sbi

11

En 1994, lors d'une réunion du comité de normalisation c ++, E. Unruh a découvert que les modèles peuvent être utilisés pour calculer quelque chose au moment de la compilation. Il a écrit un programme qui imprime des nombres premiers. La partie intrigante de cet exercice était que la production des nombres premiers était effectuée par le compilateur pendant le processus de compilation et non au moment de l'exécution. Bien que ce programme ne soit pas entièrement portable, le programme a montré que le mécanisme d'instanciation de modèle est un langage récursif primitif qui peut effectuer des calculs non triviaux au moment de la compilation.

Cet extrait est tiré des "modèles c ++" de Vandevoorde et Josuttis (chapitre 17).

Comme vous pouvez le voir, il a été découvert tôt et son pouvoir a été reconnu immédiatement.


2
Bon. Ce genre d'article que j'ai lu sur Internet aussi, je ne me souviens pas de la source. Est-ce vrai aussi pour SFINAE?
iammilind

@iammilind Que voulez-vous dire par "Est-ce vrai aussi pour SFINAE?"
BЈовић

1
SFINAE a généralement besoin du support du compilateur. Il est donc possible que cela n'ait pas été découvert accidentellement.
iammilind

@iammilind J'ai trouvé un article informit qui a un texte similaire du livre: informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић

@iammilind Modifié la réponse. Je dirais que c'était accidentellement, car la prise en charge des modèles par les compilateurs était limitée. Le programme n'était pas portable, et je pense qu'il ne fonctionnait que sur un seul compilateur
BЈовић
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.